setfsuid03.c revision d59a659cd639ca2780b00049d102acd2a783d585
1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 2d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 3d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Copyright (C) International Business Machines Corp., 2001 4d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is free software; you can redistribute it and/or modify 6d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * it under the terms of the GNU General Public License as published by 7d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * the Free Software Foundation; either version 2 of the License, or 8d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * (at your option) any later version. 9d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * This program is distributed in the hope that it will be useful, 11d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * but WITHOUT ANY WARRANTY; without even the implied warranty of 12d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 13d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * the GNU General Public License for more details. 14d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * You should have received a copy of the GNU General Public License 16d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * along with this program; if not, write to the Free Software 174548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 19d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 20d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 21d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * NAME 22d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * setfsuid03.c 23d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 24d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * DESCRIPTION 25d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Testcase to test the basic functionality of the setfsuid(2) system 26d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * call when called by a user other than root. 27d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 28d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * ALGORITHM 29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Call setfsuid(2) and test the uid returned by setfsuid(2). 30d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * If the action are allowed, 31d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * then the testcase fails. 32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * USAGE: <for command-line> 34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * setfsuid01 [-c n] [-f] [-i n] [-I x] [-P x] [-t] 35d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * where, -c n : Run n copies concurrently. 36d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -f : Turn off functionality Testing. 37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -i n : Execute test n times. 38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -I x : Execute test for x seconds. 39d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -P x : Pause for x seconds between iterations. 40d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * -t : Turn on syscall timing. 41d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 42d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * HISTORY 43d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 07/2001 Ported by Wayne Boyer 44d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 04/2003 Adapted by Dustin Kirkland (k1rkland@us.ibm.com) 45d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 46d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * RESTRICTIONS 47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * None 48d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 49d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <stdio.h> 50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <unistd.h> 51d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#ifdef __GLIBC__ 52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/fsuid.h> 53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#endif 54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/types.h> 55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h> 56d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "test.h" 57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "usctest.h" 58d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <pwd.h> 59d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 60d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid setup(void); 61d13d74bbf207c2d01598c6fef092a75b93b07c71vapiervoid cleanup(void); 62d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 63d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar *TCID = "setfsuid03"; 64d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = 1; 65d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar nobody_uid[] = "nobody"; 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct passwd *ltpuser; 67d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 68d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint main(int ac, char **av) 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 7089af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 7189af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis char *msg; 72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 73d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid_t uid; 74bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 7545e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { 7660fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 78d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 81d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid = geteuid(); 8256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid = 1; 8356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak while (!getpwuid(uid)) { 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid++; 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 86d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Check for looping state if -i option is given */ 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 89d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 90d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang /* reset tst_count in case we are looping */ 91d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 93d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST(setfsuid(uid)); 94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == -1) { 96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "call failed unexpectedly - errno %d", 97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_ERRNO); 98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (!STD_FUNCTIONAL_TEST) { 102d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "call succeeded"); 103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 105d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == uid) { 10756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 108923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "setfsuid() returned %ld, expected anything but %d", 109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_RETURN, uid); 110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "setfsuid() returned expected value : " 112923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "%ld", TEST_RETURN); 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 1161e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 1171e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 118d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 121d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 122d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * setup() - performs all ONE TIME setup for this test. 123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 12456207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* Switch to nobody user for correct error code collection */ 12756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (geteuid() != 0) { 12853740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper tst_brkm(TBROK, NULL, "Test must be run as root"); 12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ltpuser = getpwnam(nobody_uid); 13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setuid(ltpuser->pw_uid) == -1) { 13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "setuid failed to " 13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to %d", ltpuser->pw_uid); 13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak perror("setuid"); 13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 136d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 137d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(NOFORK, DEF_HANDLER, cleanup); 138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 139d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 140d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} 141d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * cleanup() - performs all ONE TIME cleanup for this test at 144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * completion or premature exit. 145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 14656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* 149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print timing stats if that option was specified. 150d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print errno log if that option was specified. 151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_CLEANUP; 153ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 154