Message ID | 1689760756-865-2-git-send-email-xuyang2018.jy@fujitsu.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [1/3] syscalls/setgroups01: Convert to new API | expand |
Hi! > + TEST(SETGROUPS(gidsetsize, groups_set)); TST_EXP_PASS(SETGROUPS(gidsetsize, groups_set)) ? > - setup(); > - > - for (lc = 0; TEST_LOOPING(lc); lc++) { > - > - tst_count = 0; > - > - /* > - * Call setgroups() to set supplimentary group IDs of > - * the calling super-user process to gid of TESTUSER. > - */ > - TEST(SETGROUPS(cleanup, gidsetsize, groups_list)); > + if (TST_RET < 0) { > + tst_res(TFAIL, "setgroups(%d, groups_set) Failed, " > + "errno=%d : %s", gidsetsize, > + TST_ERR, strerror(TST_ERR)); > + } > > - if (TEST_RETURN == -1) { > - tst_resm(TFAIL, "setgroups(%d, groups_list) Failed, " > - "errno=%d : %s", gidsetsize, TEST_ERRNO, > - strerror(TEST_ERRNO)); > - continue; > - } > + GETGROUPS(gidsetsize, groups_get); TST_EXP_VAL(GETGROUPS(gitsetsize, groups_get), 1) ? Also I suppose that we should make sure that the groups_get[0] value is not equal to the groups_set[0], expecially with -i 2 So maybe: groups_get[0] = ~groups_set[0]; > - /* > - * Call getgroups(2) to verify that > - * setgroups(2) successfully set the > - * supp. gids of TESTUSER. > - */ > - groups_list[0] = '\0'; > - if (GETGROUPS(cleanup, gidsetsize, groups_list) < 0) { > - tst_brkm(TFAIL, cleanup, "getgroups() Fails, " > - "error=%d", errno); > - } > - for (i = 0; i < NGROUPS; i++) { > - if (groups_list[i] == user_info->pw_gid) { > - tst_resm(TPASS, > - "Functionality of setgroups" > - "(%d, groups_list) successful", > - gidsetsize); > - PASS_FLAG = 1; > - } > - } > - if (PASS_FLAG == 0) { > - tst_resm(TFAIL, "Supplimentary gid %d not set " > - "for the process", user_info->pw_gid); > - } > + if (groups_get[0] == groups_set[0]) { > + tst_res(TPASS, > + "Functionality of setgroups" > + "(%d, groups_set) successful", > + gidsetsize); > } TST_EXP_EQ_LI(groups_get[0], groups_set[0]); At least that will produce TFAIL results if they don't match, which is missing here. > - cleanup(); > - tst_exit(); > } > > -/* > - * setup() - performs all ONE TIME setup for this test. > - * > - * Make sure the test process uid is root. > - * Get the supplimentrary group id of test user from /etc/passwd file. > - */ > -void setup(void) > +static void setup(void) > { > + user_info = SAFE_GETPWNAM(TESTUSER); > > - tst_require_root(); > - > - tst_sig(NOFORK, DEF_HANDLER, cleanup); > - > - TEST_PAUSE; > - > - /* Get the group id info. of TESTUSER from /etc/passwd */ > - if ((user_info = getpwnam(TESTUSER)) == NULL) { > - tst_brkm(TFAIL, cleanup, "getpwnam(2) of %s Failed", TESTUSER); > - } > + GID16_CHECK(user_info->pw_gid, setgroups); > > - if (!GID_SIZE_CHECK(user_info->pw_gid)) { > - tst_brkm(TBROK, > - cleanup, > - "gid returned from getpwnam is too large for testing setgroups16"); > - } > - > - groups_list[0] = user_info->pw_gid; > + groups_set[0] = user_info->pw_gid; Do we really need this? I suppose that any random value will do, e.g. groups_set[0] = 42; is going to be as good as anything else. > } > > -/* > - * cleanup() - performs all ONE TIME cleanup for this test at > - * completion or premature exit. > - */ > -void cleanup(void) > -{ > - > -} > +static struct tst_test test = { > + .test_all = verify_setgroups, > + .setup = setup, > + .needs_root = 1, > +}; > -- > 1.8.3.1 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
Hi! Also can we please allocate the buffers passed to setgroups/getgroups as guarded buffers[1] of size 1? [1] https://github.com/linux-test-project/ltp/wiki/C-Test-API#131-guarded-buffers
Hi Cyril > Hi! > Also can we please allocate the buffers passed to setgroups/getgroups as guarded buffers[1] of size 1? > > [1] https://github.com/linux-test-project/ltp/wiki/C-Test-API#131-guarded-buffers Yes,I will update it as you suggested. Best Regards Yang Xu
Hi Cyril Hi! + TEST(SETGROUPS(gidsetsize, groups_set)); TST_EXP_PASS(SETGROUPS(gidsetsize, groups_set)) ? OK. - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - /* - * Call setgroups() to set supplimentary group IDs of - * the calling super-user process to gid of TESTUSER. - */ - TEST(SETGROUPS(cleanup, gidsetsize, groups_list)); + if (TST_RET < 0) { + tst_res(TFAIL, "setgroups(%d, groups_set) Failed, " + "errno=%d : %s", gidsetsize, + TST_ERR, strerror(TST_ERR)); + } - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "setgroups(%d, groups_list) Failed, " - "errno=%d : %s", gidsetsize, TEST_ERRNO, - strerror(TEST_ERRNO)); - continue; - } + GETGROUPS(gidsetsize, groups_get); TST_EXP_VAL(GETGROUPS(gitsetsize, groups_get), 1) ? Also I suppose that we should make sure that the groups_get[0] value is not equal to the groups_set[0], expecially with -i 2 So maybe: groups_get[0] = ~groups_set[0]; I will update it, but the results we assume are equal. - /* - * Call getgroups(2) to verify that - * setgroups(2) successfully set the - * supp. gids of TESTUSER. - */ - groups_list[0] = '\0'; - if (GETGROUPS(cleanup, gidsetsize, groups_list) < 0) { - tst_brkm(TFAIL, cleanup, "getgroups() Fails, " - "error=%d", errno); - } - for (i = 0; i < NGROUPS; i++) { - if (groups_list[i] == user_info->pw_gid) { - tst_resm(TPASS, - "Functionality of setgroups" - "(%d, groups_list) successful", - gidsetsize); - PASS_FLAG = 1; - } - } - if (PASS_FLAG == 0) { - tst_resm(TFAIL, "Supplimentary gid %d not set " - "for the process", user_info->pw_gid); - } + if (groups_get[0] == groups_set[0]) { + tst_res(TPASS, + "Functionality of setgroups" + "(%d, groups_set) successful", + gidsetsize); } TST_EXP_EQ_LI(groups_get[0], groups_set[0]); At least that will produce TFAIL results if they don't match, which is missing here. Sound reasonable. - cleanup(); - tst_exit(); } -/* - * setup() - performs all ONE TIME setup for this test. - * - * Make sure the test process uid is root. - * Get the supplimentrary group id of test user from /etc/passwd file. - */ -void setup(void) +static void setup(void) { + user_info = SAFE_GETPWNAM(TESTUSER); - tst_require_root(); - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; - - /* Get the group id info. of TESTUSER from /etc/passwd */ - if ((user_info = getpwnam(TESTUSER)) == NULL) { - tst_brkm(TFAIL, cleanup, "getpwnam(2) of %s Failed", TESTUSER); - } + GID16_CHECK(user_info->pw_gid, setgroups); - if (!GID_SIZE_CHECK(user_info->pw_gid)) { - tst_brkm(TBROK, - cleanup, - "gid returned from getpwnam is too large for testing setgroups16"); - } - - groups_list[0] = user_info->pw_gid; + groups_set[0] = user_info->pw_gid; Do we really need this? I suppose that any random value will do, e.g. groups_set[0] = 42; is going to be as good as anything else. Agree. } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ -void cleanup(void) -{ - -} +static struct tst_test test = { + .test_all = verify_setgroups, + .setup = setup, + .needs_root = 1, +}; -- 1.8.3.1 -- Mailing list info: https://lists.linux.it/listinfo/ltp Best Regards Yang Xu
diff --git a/testcases/kernel/syscalls/setgroups/setgroups02.c b/testcases/kernel/syscalls/setgroups/setgroups02.c index de23a4a..08bdc3c 100644 --- a/testcases/kernel/syscalls/setgroups/setgroups02.c +++ b/testcases/kernel/syscalls/setgroups/setgroups02.c @@ -1,180 +1,68 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /* - * - * 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 + * Copyright (c) International Business Machines Corp., 2001 + * Copyright (c) Linux Test Project, 2003-2023 + * 07/2001 Ported by Wayne Boyer */ -/* - * Test Name: setgroups02 - * - * Test Description: - * Verify that, only root process can invoke setgroups() system call to - * set the supplementary group IDs of the process. - * - * Expected Result: - * The call succeeds in setting all the supplementary group IDs of the - * calling process. The new group should be set in the process supplemental - * group list. - * - * Algorithm: - * Setup: - * Setup signal handling. - * Pause for SIGUSR1 if option specified. +/*\ + * [Description] * - * Test: - * Loop if the proper options are given. - * Execute system call - * Check return code, if system call failed (return=-1) - * Log the errno and Issue a FAIL message. - * Otherwise, - * Verify the Functionality of system call - * if successful, - * Issue Functionality-Pass message. - * Otherwise, - * Issue Functionality-Fail message. - * Cleanup: - * Print errno log and/or timing stats if options given + * Check that only the root process can invoke setgroups() + * to set supplementary group IDs. * - * Usage: <for command-line> - * setgroups02 [-c n] [-f] [-i n] [-I x] [-P x] [-t] - * where, -c n : Run n copies concurrently. - * -f : Turn off functionality Testing. - * -i n : Execute test n times. - * -I x : Execute test for x seconds. - * -P x : Pause for x seconds between iterations. - * -t : Turn on syscall timing. - * - * HISTORY - * 07/2001 Ported by Wayne Boyer - * - * RESTRICTIONS: - * This test should be run by 'super-user' (root) only. + * [Expected Result] * + * The call succeeds in setting all the supplementary group IDs + * of the calling process. The new group should be set in the + * process supplemental group list. */ -#include <sys/types.h> -#include <unistd.h> -#include <errno.h> -#include <pwd.h> -#include <grp.h> -#include <sys/param.h> -#include "test.h" +#include <pwd.h> -#include "compat_16.h" +#include "tst_test.h" +#include "compat_tst_16.h" #define TESTUSER "nobody" -TCID_DEFINE(setgroups02); -int TST_TOTAL = 1; /* Total number of test conditions */ -GID_T groups_list[NGROUPS]; /* Array to hold gids for getgroups() */ +static GID_T groups_get[NGROUPS]; +static GID_T groups_set[NGROUPS]; -struct passwd *user_info; /* struct. to hold test user info */ -void setup(); /* setup function for the test */ -void cleanup(); /* cleanup function for the test */ +static struct passwd *user_info; -int main(int ac, char **av) +static void verify_setgroups(void) { - int lc, i; - int gidsetsize = 1; /* only one GID, the GID of TESTUSER */ - int PASS_FLAG = 0; /* used for checking group array */ + int gidsetsize = 1; - tst_parse_opts(ac, av, NULL, NULL); + TEST(SETGROUPS(gidsetsize, groups_set)); - setup(); - - for (lc = 0; TEST_LOOPING(lc); lc++) { - - tst_count = 0; - - /* - * Call setgroups() to set supplimentary group IDs of - * the calling super-user process to gid of TESTUSER. - */ - TEST(SETGROUPS(cleanup, gidsetsize, groups_list)); + if (TST_RET < 0) { + tst_res(TFAIL, "setgroups(%d, groups_set) Failed, " + "errno=%d : %s", gidsetsize, + TST_ERR, strerror(TST_ERR)); + } - if (TEST_RETURN == -1) { - tst_resm(TFAIL, "setgroups(%d, groups_list) Failed, " - "errno=%d : %s", gidsetsize, TEST_ERRNO, - strerror(TEST_ERRNO)); - continue; - } + GETGROUPS(gidsetsize, groups_get); - /* - * Call getgroups(2) to verify that - * setgroups(2) successfully set the - * supp. gids of TESTUSER. - */ - groups_list[0] = '\0'; - if (GETGROUPS(cleanup, gidsetsize, groups_list) < 0) { - tst_brkm(TFAIL, cleanup, "getgroups() Fails, " - "error=%d", errno); - } - for (i = 0; i < NGROUPS; i++) { - if (groups_list[i] == user_info->pw_gid) { - tst_resm(TPASS, - "Functionality of setgroups" - "(%d, groups_list) successful", - gidsetsize); - PASS_FLAG = 1; - } - } - if (PASS_FLAG == 0) { - tst_resm(TFAIL, "Supplimentary gid %d not set " - "for the process", user_info->pw_gid); - } + if (groups_get[0] == groups_set[0]) { + tst_res(TPASS, + "Functionality of setgroups" + "(%d, groups_set) successful", + gidsetsize); } - - cleanup(); - tst_exit(); } -/* - * setup() - performs all ONE TIME setup for this test. - * - * Make sure the test process uid is root. - * Get the supplimentrary group id of test user from /etc/passwd file. - */ -void setup(void) +static void setup(void) { + user_info = SAFE_GETPWNAM(TESTUSER); - tst_require_root(); - - tst_sig(NOFORK, DEF_HANDLER, cleanup); - - TEST_PAUSE; - - /* Get the group id info. of TESTUSER from /etc/passwd */ - if ((user_info = getpwnam(TESTUSER)) == NULL) { - tst_brkm(TFAIL, cleanup, "getpwnam(2) of %s Failed", TESTUSER); - } + GID16_CHECK(user_info->pw_gid, setgroups); - if (!GID_SIZE_CHECK(user_info->pw_gid)) { - tst_brkm(TBROK, - cleanup, - "gid returned from getpwnam is too large for testing setgroups16"); - } - - groups_list[0] = user_info->pw_gid; + groups_set[0] = user_info->pw_gid; } -/* - * cleanup() - performs all ONE TIME cleanup for this test at - * completion or premature exit. - */ -void cleanup(void) -{ - -} +static struct tst_test test = { + .test_all = verify_setgroups, + .setup = setup, + .needs_root = 1, +};
Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com> --- testcases/kernel/syscalls/setgroups/setgroups02.c | 194 +++++----------------- 1 file changed, 41 insertions(+), 153 deletions(-)