tst_safe_macros: add SAFE_GETGRGID()
PATCH v3 2/5 tst_safe_macros: add SAFE_GETGRGID()
Add tst safe wrapper for getgrgid() function.
Zero errno before calling getgrnam() or getgrgid() to get the correct errno printed in tst_brk_(TERRNO).
--- include/tst_safe_macros.h | 4 ++++ lib/tst_safe_macros.c | 15 +++++++++++++++ 2 files changed, 19 insertions(+)
include/tst_safe_macros.h +4 -0
@@ -441,6 +441,10 @@ struct group *safe_getgrnam(const char *file, const int lineno,#define SAFE_GETGRNAM (name) \ safe_getgrnam(__FILE__, __LINE__, (name)) +struct group *safe_getgrgid (const char *file,const int lineno,gid_t gid); +#define SAFE_GETGRGID (gid) \ + safe_getgrgid(__FILE__, __LINE__, (gid)) +ssize_t safe_getxattr (const char *file,const int lineno,const char *path,const char *name,void *value,size_t size);#define SAFE_GETXATTR (path, name, value, size) \
lib/tst_safe_macros.c +15 -0
@@ -144,6 +144,7 @@ struct group *safe_getgrnam(const char *file, const int lineno, {struct group *rval; + errno =0 ; rval =getgrnam (name);if (rval ==NULL ) { tst_brk_(file, lineno, TBROK | TERRNO,
@@ -153,6 +154,20 @@ struct group *safe_getgrnam(const char *file, const int lineno,return rval; } +struct group *safe_getgrgid (const char *file,const int lineno,gid_t gid) +{ +struct group *rval; + + errno =0 ; + rval =getgrgid (gid); +if (rval ==NULL ) { +tst_brk_ (file, lineno,TBROK |TERRNO , +"getgrgid(%li) failed" , (long )gid); + } + +return rval; +} +int safe_chroot (const char *file,const int lineno,const char *path) {int rval;
Signature · 1 line
2.16.4
PATCH v3 3/5 setregid02: Convert to newlib
* Changed some messaged to show errno as string.
* Used SAVE_* functions for getgrnam(), getgrgid() and getpwnam()
* Format changes, put constants on right side
--- testcases/kernel/syscalls/setregid/setregid02.c | 138 ++++++++---------------- 1 file changed, 44 insertions(+), 94 deletions(-)
testcases/kernel/syscalls/setregid/setregid02.c +44 -94
@@ -1,21 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 /* -* * Copyright (c) International Business Machines Corp., 2001 * -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -* the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* * Ported by John George */
@@ -29,13 +15,9 @@#include <pwd.h> #include <grp.h> #include <stdlib.h> -#include <string.h> -#include "test.h" -#include "safe_macros.h" -#include "compat_16.h" - -TCID_DEFINE (setregid02); +#include "tst_test.h" +#include "compat_tst_16.h" static gid_t neg_one =-1 ;
@@ -48,14 +30,14 @@ static struct group ltpgroup, root, bin;* is used for a separate test. The tests are executed in the for loop below. */ -struct test_data_t { +static struct tcase {gid_t *real_gid;gid_t *eff_gid;int exp_errno;struct group *exp_real_usr;struct group *exp_eff_usr;char *test_msg; -} test_data[] = { +} tcases[] = { { &neg_one, &root.gr_gid,EPERM , <pgroup, <pgroup,"After setregid(-1, root)," }, {
@@ -71,113 +53,81 @@ struct test_data_t { "After setregid(bin, root),"} }; -int TST_TOTAL =ARRAY_SIZE (test_data); - -static void setup (void );static void gid_verify (struct group *ru,struct group *eu,char *when);static struct group get_group_by_name (const char *name);static struct group get_group_by_gid (gid_t gid); -int main (int ac,char **av) +static void run (unsigned int n) { -int lc; - -tst_parse_opts (ac, av,NULL ,NULL ); - -setup (); - -for (lc =0 ;TEST_LOOPING (lc); lc++) { -int i; - - tst_count =0 ; - -for (i =0 ; i <TST_TOTAL ; i++) { -/* Set the real or effective group id */ -TEST (SETREGID (NULL , *test_data[i].real_gid, - *test_data[i].eff_gid)); - -if (TEST_RETURN ==-1 ) { -if (TEST_ERRNO == test_data[i].exp_errno) { -tst_resm (TPASS ,"setregid(%d, %d) " -"failed as expected." , - *test_data[i].real_gid, - *test_data[i].eff_gid); - }else { -tst_resm (TFAIL ,"setregid(%d, %d) " -"failed (%d) but did not set the " -"expected errno (%d)." , - *test_data[i].real_gid, - *test_data[i].eff_gid, -TEST_ERRNO , - test_data[i].exp_errno); - } - }else { -tst_resm (TFAIL ,"setregid(%d, %d) " -"did not fail (ret: %ld) as expected (ret: -1)." , - *test_data[i].real_gid, - *test_data[i].eff_gid,TEST_RETURN ); - } -gid_verify (test_data[i].exp_real_usr, - test_data[i].exp_eff_usr, - test_data[i].test_msg); +struct tcase *tc = &tcases[n]; + +/* Set the real or effective group id */ +TEST (SETREGID (*tc->real_gid, *tc->eff_gid)); + +if (TST_RET ==-1 ) { +if (tc->exp_errno ==TST_ERR ) { +tst_res (TPASS |TTERRNO , +"setregid(%d, %d) failed as expected" , + *tc->real_gid, *tc->eff_gid); + }else { +tst_res (TFAIL |TTERRNO , +"setregid(%d, %d) failed unexpectedly, expected %s" , + *tc->real_gid, *tc->eff_gid, +tst_strerrno (tc->exp_errno)); } + }else { +tst_res (TFAIL , +"setregid(%d, %d) did not fail (ret: %ld) as expected (ret: -1)." , + *tc->real_gid, *tc->eff_gid,TST_RET ); } - -tst_exit (); +gid_verify (tc->exp_real_usr, tc->exp_eff_usr, tc->test_msg); }static void setup (void ) { -tst_require_root (); + ltpuser =SAFE_GETPWNAM ("nobody" ); -tst_sig (FORK ,DEF_HANDLER ,NULL ); - - ltpuser =getpwnam ("nobody" ); -if (ltpuser ==NULL ) -tst_brkm (TBROK ,NULL ,"getpwnam(\"nobody\") failed" ); - -SAFE_SETGID (NULL , ltpuser->pw_gid); -SAFE_SETUID (NULL , ltpuser->pw_uid); +SAFE_SETGID (ltpuser->pw_gid); +SAFE_SETUID (ltpuser->pw_uid); root =get_group_by_name ("root" ); ltpgroup =get_group_by_gid (ltpuser->pw_gid); bin =get_group_by_name ("bin" ); - -TEST_PAUSE ; }static struct group get_group_by_name (const char *name) { -struct group *ret =getgrnam (name); - -if (ret ==NULL ) -tst_brkm (TBROK |TERRNO ,NULL ,"getgrnam(\"%s\") failed" , name); +struct group *ret =SAFE_GETGRNAM (name); -GID16_CHECK (ret->gr_gid, setregid,NULL ); +GID16_CHECK (ret->gr_gid, setregid);return *ret; }static struct group get_group_by_gid (gid_t gid) { -struct group *ret =getgrgid (gid); +struct group *ret =SAFE_GETGRGID (gid); -if (ret ==NULL ) -tst_brkm (TBROK |TERRNO ,NULL ,"getgrgid(\"%d\") failed" , gid); - -GID16_CHECK (ret->gr_gid, setregid,NULL ); +GID16_CHECK (ret->gr_gid, setregid);return *ret; } -void gid_verify (struct group *rg,struct group *eg,char *when) {if ((getgid () != rg->gr_gid) || (getegid () != eg->gr_gid)) { -tst_resm (TFAIL ,"ERROR: %s real gid = %d; effective gid = %d" , +tst_res (TFAIL ,"ERROR: %s real gid = %d; effective gid = %d" , when,getgid (),getegid ()); -tst_resm (TINFO ,"Expected: real gid = %d; effective gid = %d" , +tst_res (TINFO ,"Expected: real gid = %d; effective gid = %d" , rg->gr_gid, eg->gr_gid); }else { -tst_resm (TPASS ,"real or effective gid was modified as expected" ); +tst_res (TPASS , +"real or effective gid was modified as expected" ); } } + +static struct tst_test test = { + .tcnt =ARRAY_SIZE (tcases), + .needs_root =1 , + .test = run, + .setup = setup, +};
Signature · 1 line
2.16.4
PATCH v3 3/5 setregid02: Convert to newlib
Hi!
Pushed with minor changes, for instance I've rerganized the static functions so that we do not need any forward function declarations.
And pushed, thanks.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v3 4/5 tst_safe_macros: add SAFE_GETGRNAM_FALLBACK()
In reply to Clemens Famulla-ConradThis function retrieves the group by name. If the group doesn't exists fall back to the second name given. If the second group doesn't exists, exit with TBROK.
--- include/tst_safe_macros.h | 5 +++++ lib/tst_safe_macros.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+)
include/tst_safe_macros.h +5 -0
@@ -441,6 +441,11 @@ struct group *safe_getgrnam(const char *file, const int lineno,#define SAFE_GETGRNAM (name) \ safe_getgrnam(__FILE__, __LINE__, (name)) +struct group *safe_getgrnam_fallback (const char *file,const int lineno, +const char *name,const char *fallback); +#define SAFE_GETGRNAM_FALLBACK (name, fallback) \ + safe_getgrnam_fallback(__FILE__, __LINE__, (name), (fallback)) +struct group *safe_getgrgid (const char *file,const int lineno,gid_t gid);#define SAFE_GETGRGID (gid) \ safe_getgrgid(__FILE__, __LINE__, (gid))
lib/tst_safe_macros.c +16 -0
@@ -154,6 +154,22 @@ struct group *safe_getgrnam(const char *file, const int lineno,return rval; } +struct group *safe_getgrnam_fallback (const char *file,const int lineno, +const char *name,const char *fallback) +{ +struct group *rval; + + rval =getgrnam (name); +if (rval ==NULL ) { +tst_res_ (file, lineno,TINFO , +"getgrnam(%s) failed - try fallback %s" , + name, fallback); + rval =safe_getgrnam (file, lineno, fallback); + } + +return rval; +} +struct group *safe_getgrgid (const char *file,const int lineno,gid_t gid) {struct group *rval;
Signature · 1 line
2.16.4
PATCH v3 4/5 tst_safe_macros: add SAFE_GETGRNAM_FALLBACK()
Hi!
lib/tst_safe_macros.c struct group *safe_getgrnam(const char *file, const int lineno, · line 161
Quoted 5 lines
lib/tst_safe_macros.c +5
-0+struct group *safe_getgrnam_fallback (const char *file,const int lineno, +const char *name,const char *fallback) +{ +struct group *rval; +
I've added a missing errno = 0; here and pushed.
Thanks.
Quoted 17 lines
lib/tst_safe_macros.c +11
-0+ rval =getgrnam (name); +if (rval ==NULL ) { +tst_res_ (file, lineno,TINFO , +"getgrnam(%s) failed - try fallback %s" , + name, fallback); + rval =safe_getgrnam (file, lineno, fallback); + } + +return rval; +} +struct group *safe_getgrgid (const char *file,const int lineno,gid_t gid) {struct group *rval;Signature · 1 line
2.16.4
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v3 5/5 setregid04: Convert to newlib
In reply to Clemens Famulla-Conrad--- testcases/kernel/syscalls/setregid/setregid04.c | 116 ++++++------------------ 1 file changed, 27 insertions(+), 89 deletions(-)
testcases/kernel/syscalls/setregid/setregid04.c +27 -89
@@ -1,20 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (c) International Business Machines Corp., 2001 * -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -* the GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -* * Ported by John George */
@@ -22,16 +9,8 @@* Test setregid() when executed by root. */ -#include <errno.h> -#include <pwd.h> -#include <grp.h> -#include <stdlib.h> -#include <string.h> - -#include "test.h" -#include "compat_16.h" - -TCID_DEFINE (setregid04); +#include "tst_test.h" +#include "compat_tst_16.h" static gid_t neg_one =-1 ;
@@ -70,88 +49,47 @@ struct test_data_t { "After setregid(-1, nobody)"} }; -int TST_TOTAL =sizeof (test_data) /sizeof (test_data[0 ]); -static void setup (void ); -static void cleanup (void );static void gid_verify (struct group *ru,struct group *eu,const char *when); -int main (int ac,char **av) +static void run (unsigned int i) { -int lc; +/* Set the real or effective group id */ +TEST (SETREGID (*test_data[i].real_gid, *test_data[i].eff_gid)); -tst_parse_opts (ac, av,NULL ,NULL ); - -setup (); - -for (lc =0 ;TEST_LOOPING (lc); lc++) { -int i; - - tst_count =0 ; - -for (i =0 ; i <TST_TOTAL ; i++) { -/* Set the real or effective group id */ -TEST (SETREGID (cleanup, *test_data[i].real_gid, - *test_data[i].eff_gid)); - -if (TEST_RETURN ==-1 ) { -tst_resm (TBROK ,"setregid(%d, %d) failed" , - *test_data[i].real_gid, - *test_data[i].eff_gid); - }else { -gid_verify (test_data[i].exp_real_usr, - test_data[i].exp_eff_usr, - test_data[i].test_msg); - } - } +if (TST_RET ==-1 ) { +tst_res (TBROK |TTERRNO ,"setregid(%d, %d) failed" , + *test_data[i].real_gid, *test_data[i].eff_gid); + }else { +gid_verify (test_data[i].exp_real_usr, test_data[i].exp_eff_usr, + test_data[i].test_msg); } - -cleanup (); -tst_exit (); } -#define SAFE_GETGROUP (GROUPNAME ) \ - if (getgrnam(#GROUPNAME) == NULL) { \ - tst_brkm(TBROK, NULL, "Couldn't find the `" #GROUPNAME "' group"); \ - } \ - GROUPNAME ## _gr = *(getgrnam(#GROUPNAME)); - -#define SAFE_GETGROUP_FALLBACK (GROUPNAME ,GROUPNAME2 ) \ - if (getgrnam(#GROUPNAME) != NULL) \ - GROUPNAME ## _gr = *(getgrnam(#GROUPNAME)); \ - else if (getgrnam(#GROUPNAME2) != NULL) { \ - GROUPNAME ## _gr = *(getgrnam(#GROUPNAME2)); \ - tst_resm(TINFO, "`" #GROUPNAME "' group not found, trying fallback `" #GROUPNAME2 "' group"); \ - } else \ - tst_brkm(TBROK, NULL, "Couldn't find neither`" #GROUPNAME "' `" #GROUPNAME2 "' nor group"); -static void setup (void ) { -tst_require_root (); - -tst_sig (FORK ,DEF_HANDLER , cleanup); - -SAFE_GETGROUP (root); -SAFE_GETGROUP_FALLBACK (nobody, nogroup); -SAFE_GETGROUP (daemon); -SAFE_GETGROUP (bin); - -TEST_PAUSE ; -} - -static void cleanup (void ) -{ + root_gr = *SAFE_GETGRNAM ("root" ); + nobody_gr = *SAFE_GETGRNAM_FALLBACK ("nobody" ,"nogroup" ); + daemon_gr = *SAFE_GETGRNAM ("daemon" ); + bin_gr = *SAFE_GETGRNAM ("bin" ); }static void gid_verify (struct group *rg,struct group *eg,const char *when) {if ((getgid () != rg->gr_gid) || (getegid () != eg->gr_gid)) { -tst_resm (TFAIL ,"ERROR: %s real gid = %d; effective gid = %d" , +tst_res (TFAIL ,"ERROR: %s real gid = %d; effective gid = %d" , when,getgid (),getegid ()); -tst_resm (TINFO ,"Expected: real gid = %d; effective gid = %d" , +tst_res (TINFO ,"Expected: real gid = %d; effective gid = %d" , rg->gr_gid, eg->gr_gid); }else { -tst_resm (TPASS ,"real or effective gid was modified as " -"expected" ); +tst_res (TPASS , +"real or effective gid was modified as expected" ); } } + +static struct tst_test test = { + .tcnt =ARRAY_SIZE (test_data), + .needs_root =1 , + .test = run, + .setup = setup, +};
Signature · 1 line
2.16.4
PATCH v3 5/5 setregid04: Convert to newlib
Hi!
Pushed with minor changes, same as setregid02, thanks.
Signature · 2 lines
Cyril Hrubis [email protected]
PATCH v3 2/5 tst_safe_macros: add SAFE_GETGRGID()
In reply to Clemens Famulla-ConradHi!
I've split this patch in two, one that adds errno = 0 to getgrnam and second that adds the SAFE_GETGRGID and pushed, thanks.
Signature · 2 lines
Cyril Hrubis [email protected]