setfsuid03.c revision 60fa8014af7534eaefa901200c8df4b74ce422e6
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 17d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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; 65d13d74bbf207c2d01598c6fef092a75b93b07c71vapierextern int Tst_count; 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapierchar nobody_uid[] = "nobody"; 67d13d74bbf207c2d01598c6fef092a75b93b07c71vapierstruct passwd *ltpuser; 68d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint main(int ac, char **av) 70d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 7156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak int lc; /* loop counter */ 7256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak char *msg; /* message returned from parse_opts */ 73d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 74d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid_t uid; 75bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 76d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* parse standard options */ 7745e285d46ab47b0ff76c88acb5ba97b0bd5f753dGarrett Cooper if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) { 7860fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 81d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 82d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 83d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid = geteuid(); 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid = 1; 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak while (!getpwuid(uid)) { 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid++; 8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 89d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Check for looping state if -i option is given */ 90d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 91d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 92d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* reset Tst_count in case we are looping */ 93d13d74bbf207c2d01598c6fef092a75b93b07c71vapier Tst_count = 0; 94d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST(setfsuid(uid)); 96d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 97d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == -1) { 98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TFAIL, "call failed unexpectedly - errno %d", 99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_ERRNO); 100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 102d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (!STD_FUNCTIONAL_TEST) { 104d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "call succeeded"); 105d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 108d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == uid) { 10956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 110923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "setfsuid() returned %ld, expected anything but %d", 111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_RETURN, uid); 112d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "setfsuid() returned expected value : " 114923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "%ld", TEST_RETURN); 115d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 116d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 117d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 118d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 119d13d74bbf207c2d01598c6fef092a75b93b07c71vapier return 0; 120d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 12156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /*NOTREACHED*/} 122d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 123d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 124d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * setup() - performs all ONE TIME setup for this test. 125d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 12656207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid setup() 127d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 12856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak /* Switch to nobody user for correct error code collection */ 12956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (geteuid() != 0) { 13056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_brkm(TBROK, tst_exit, "Test must be run as root"); 13156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 13256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ltpuser = getpwnam(nobody_uid); 13356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setuid(ltpuser->pw_uid) == -1) { 13456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "setuid failed to " 13556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to %d", ltpuser->pw_uid); 13656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak perror("setuid"); 13756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 138d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 139d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* capture signals */ 140d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(NOFORK, DEF_HANDLER, cleanup); 141d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 142d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* Pause if that option was specified */ 143d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 144d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} 145d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 146d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 147d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * cleanup() - performs all ONE TIME cleanup for this test at 148d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * completion or premature exit. 149d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 15056207cec7732e09c216c751c0b5f88a242bacae6subrata_modakvoid cleanup() 151d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 152d13d74bbf207c2d01598c6fef092a75b93b07c71vapier /* 153d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print timing stats if that option was specified. 154d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * print errno log if that option was specified. 155d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 156d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_CLEANUP; 157d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} 158