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" 330e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh#include "compat_16.h" 34d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 350e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void setup(void); 360e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void cleanup(void); 37d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 380e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav KholmanskikhTCID_DEFINE(setfsuid03); 39d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint TST_TOTAL = 1; 400e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 410e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic char nobody_uid[] = "nobody"; 420e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic struct passwd *ltpuser; 43d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 44d13d74bbf207c2d01598c6fef092a75b93b07c71vapierint main(int ac, char **av) 45d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 4689af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 47d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 48d13d74bbf207c2d01598c6fef092a75b93b07c71vapier uid_t uid; 49bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 50d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 51d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 52d13d74bbf207c2d01598c6fef092a75b93b07c71vapier setup(); 53d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 5456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid = 1; 550e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh while (!getpwuid(uid)) 5656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak uid++; 57d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 580e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh UID16_CHECK(uid, setfsuid, cleanup); 590e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 60d13d74bbf207c2d01598c6fef092a75b93b07c71vapier for (lc = 0; TEST_LOOPING(lc); lc++) { 61d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 62d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 63d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 640e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh TEST(SETFSUID(cleanup, uid)); 65d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 66d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == -1) { 670e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_resm(TFAIL | TTERRNO, 680e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh "setfsuid() failed unexpectedly"); 69d13d74bbf207c2d01598c6fef092a75b93b07c71vapier continue; 70d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 71d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 72d13d74bbf207c2d01598c6fef092a75b93b07c71vapier if (TEST_RETURN == uid) { 7356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TFAIL, 74923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "setfsuid() returned %ld, expected anything but %d", 75d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_RETURN, uid); 76d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } else { 77d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_resm(TPASS, "setfsuid() returned expected value : " 78923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak "%ld", TEST_RETURN); 79d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 80d13d74bbf207c2d01598c6fef092a75b93b07c71vapier } 810e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 82d13d74bbf207c2d01598c6fef092a75b93b07c71vapier cleanup(); 831e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao} 85d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 860e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void setup(void) 87d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 88d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis tst_require_root(); 890e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 9056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ltpuser = getpwnam(nobody_uid); 910e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh if (ltpuser == NULL) 920e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_brkm(TBROK, cleanup, "getpwnam failed for user id %s", 930e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh nobody_uid); 940e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh 950e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh if (setuid(ltpuser->pw_uid) == -1) 960e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikh tst_resm(TINFO | TERRNO, "setuid failed to " 9756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to %d", ltpuser->pw_uid); 98d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 99d13d74bbf207c2d01598c6fef092a75b93b07c71vapier tst_sig(NOFORK, DEF_HANDLER, cleanup); 100d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 101d13d74bbf207c2d01598c6fef092a75b93b07c71vapier TEST_PAUSE; 102d13d74bbf207c2d01598c6fef092a75b93b07c71vapier} 103d13d74bbf207c2d01598c6fef092a75b93b07c71vapier 1040e7a99b5316fdefc8fb8df77e7d0e2abff7511acStanislav Kholmanskikhstatic void cleanup(void) 105d13d74bbf207c2d01598c6fef092a75b93b07c71vapier{ 106ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 107