setfsuid03.c revision 0e7a99b5316fdefc8fb8df77e7d0e2abff7511ac
1d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 20e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * Copyright (C) International Business Machines Corp., 2001 30e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * Ported by Wayne Boyer 40e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * Adapted by Dustin Kirkland (k1rkland@us.ibm.com) 5d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 60e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * This program is free software; you can redistribute it and/or modify 70e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * it under the terms of the GNU General Public License as published by 80e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * the Free Software Foundation; either version 2 of the License, or 90e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * (at your option) any later version. 10d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 110e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * This program is distributed in the hope that it will be useful, 120e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * but WITHOUT ANY WARRANTY; without even the implied warranty of 130e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 140e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * the GNU General Public License for more details. 15d13d74bbf207c2d01598c6fef092a75b93b07c71vapier * 160e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * You should have received a copy of the GNU General Public License 170e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * along with this program; if not, write to the Free Software 180e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 20d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 21d13d74bbf207c2d01598c6fef092a75b93b07c71vapier/* 220e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * Testcase to test the basic functionality of the setfsuid(2) system 230e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh * call when called by a user other than root. 24d13d74bbf207c2d01598c6fef092a75b93b07c71vapier */ 250e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 26d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <stdio.h> 27d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <unistd.h> 28d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <sys/types.h> 29d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include <errno.h> 300e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#include <pwd.h> 310e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 32d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "test.h" 33d13d74bbf207c2d01598c6fef092a75b93b07c71vapier#include "usctest.h" 340e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#include "compat_16.h" 35d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 360e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void setup(void); 370e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void cleanup(void); 38d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 390e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav KholmanskikhTCID_DEFINE(setfsuid03); 40d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = 1; 410e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 420e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic char nobody_uid[] = "nobody"; 430e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic struct passwd *ltpuser; 44d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 45d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint main(int ac, char **av) 46d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 4789af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 4889af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis char *msg; 49d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 50d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid_t uid; 51bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 520e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh if ((msg = parse_opts(ac, av, NULL, NULL)) != NULL) 5360fa8014af7534eaefa901200c8df4b74ce422e6Garrett Cooper tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); 54d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 55d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 56d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 5756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid = 1; 580e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh while (!getpwuid(uid)) 5956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid++; 60d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 610e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh UID16_CHECK(uid, setfsuid, cleanup); 620e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 63d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 64d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 65d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 670e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh TEST(SETFSUID(cleanup, uid)); 68d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == -1) { 700e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_resm(TFAIL | TTERRNO, 710e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh "setfsuid() failed unexpectedly"); 72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 73d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 74d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 75d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (!STD_FUNCTIONAL_TEST) { 760e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_resm(TPASS, "setfsuid() succeeded"); 77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 78d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == uid) { 8156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 82923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "setfsuid() returned %ld, expected anything but %d", 83d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_RETURN, uid); 84d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "setfsuid() returned expected value : " 86923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "%ld", TEST_RETURN); 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 88d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 890e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 90d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 911e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 93d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 940e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void setup(void) 95d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 960e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_require_root(NULL); 970e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 9856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ltpuser = getpwnam(nobody_uid); 990e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh if (ltpuser == NULL) 1000e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_brkm(TBROK, cleanup, "getpwnam failed for user id %s", 1010e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh nobody_uid); 1020e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 1030e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh if (setuid(ltpuser->pw_uid) == -1) 1040e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_resm(TINFO | TERRNO, "setuid failed to " 10556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to %d", ltpuser->pw_uid); 106d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 107d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(NOFORK, DEF_HANDLER, cleanup); 108d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 109d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 110d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} 111d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1120e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void cleanup(void) 113d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 114d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_CLEANUP; 115ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 116