1865695bbc89088b9526ea9045410e5afb70a985cplars/* 27dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * Copyright (c) International Business Machines Corp., 2001 37dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * Ported by Wayne Boyer 4865695bbc89088b9526ea9045410e5afb70a985cplars * 57dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * This program is free software; you can redistribute it and/or modify 67dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * it under the terms of the GNU General Public License as published by 77dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * the Free Software Foundation; either version 2 of the License, or 87dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 107dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * This program is distributed in the hope that it will be useful, 117dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 127dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 137dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 157dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * You should have received a copy of the GNU General Public License 167dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * along with this program; if not, write to the Free Software 177dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 217dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis * Test to check the error and trivial conditions in setuid 22865695bbc89088b9526ea9045410e5afb70a985cplars */ 237dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis 24865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 251c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include <pwd.h> 26865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/types.h> 27fa451a14d1fd38a2c32ff2a66474bafbf5b6c9dfrobbiew#include <sys/stat.h> 28865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h> 291c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 30865695bbc89088b9526ea9045410e5afb70a985cplars#include "test.h" 311c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh#include "compat_16.h" 32865695bbc89088b9526ea9045410e5afb70a985cplars 33865695bbc89088b9526ea9045410e5afb70a985cplars#define ROOT_USER 0 34865695bbc89088b9526ea9045410e5afb70a985cplars 35fa31d55d3486830313bd044f7333697ce6124d22nstrazchar *TCID = "setuid03"; 36865695bbc89088b9526ea9045410e5afb70a985cplarsint TST_TOTAL = 1; 37865695bbc89088b9526ea9045410e5afb70a985cplars 387dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic char nobody_uid[] = "nobody"; 397dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic struct passwd *ltpuser; 40865695bbc89088b9526ea9045410e5afb70a985cplars 417dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic void setup(void); 427dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic void cleanup(void); 43865695bbc89088b9526ea9045410e5afb70a985cplars 44fa451a14d1fd38a2c32ff2a66474bafbf5b6c9dfrobbiewint main(int ac, char **av) 45865695bbc89088b9526ea9045410e5afb70a985cplars{ 4689af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis int lc; 47865695bbc89088b9526ea9045410e5afb70a985cplars 48d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 49865695bbc89088b9526ea9045410e5afb70a985cplars 50865695bbc89088b9526ea9045410e5afb70a985cplars setup(); 51865695bbc89088b9526ea9045410e5afb70a985cplars 52865695bbc89088b9526ea9045410e5afb70a985cplars for (lc = 0; TEST_LOOPING(lc); lc++) { 53d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang tst_count = 0; 54865695bbc89088b9526ea9045410e5afb70a985cplars 551c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh TEST(SETUID(cleanup, ROOT_USER)); 56865695bbc89088b9526ea9045410e5afb70a985cplars 57865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_RETURN != -1) { 58865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "call succeeded unexpectedly"); 59865695bbc89088b9526ea9045410e5afb70a985cplars continue; 60865695bbc89088b9526ea9045410e5afb70a985cplars } 61865695bbc89088b9526ea9045410e5afb70a985cplars 62865695bbc89088b9526ea9045410e5afb70a985cplars if (TEST_ERRNO == EPERM) { 63865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TPASS, "setuid returned errno EPERM"); 64865695bbc89088b9526ea9045410e5afb70a985cplars } else { 65865695bbc89088b9526ea9045410e5afb70a985cplars tst_resm(TFAIL, "setuid returned unexpected errno - %d", 66865695bbc89088b9526ea9045410e5afb70a985cplars TEST_ERRNO); 67865695bbc89088b9526ea9045410e5afb70a985cplars } 68865695bbc89088b9526ea9045410e5afb70a985cplars } 697dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubis 70865695bbc89088b9526ea9045410e5afb70a985cplars cleanup(); 711e6f5a673655551de5734ff31ef48cd63b604e6dGarrett Cooper tst_exit(); 72865695bbc89088b9526ea9045410e5afb70a985cplars} 73865695bbc89088b9526ea9045410e5afb70a985cplars 747dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic void setup(void) 75865695bbc89088b9526ea9045410e5afb70a985cplars{ 76d1e794d62b1bf619df8390535e4c2a58899b1145Cyril Hrubis tst_require_root(); 771c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 785901ff4b9d18b497eb72630f3b5654e14cb274f0robbiew /* Switch to nobody user for correct error code collection */ 7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak ltpuser = getpwnam(nobody_uid); 801c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh if (ltpuser == NULL) 811c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh tst_brkm(TBROK, cleanup, "getpwnam failed for user id %s", 821c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh nobody_uid); 831c44244849cee68dec5f38a61a3441b0e0a3b472Stanislav Kholmanskikh 8456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak if (setuid(ltpuser->pw_uid) == -1) { 8556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_resm(TINFO, "setuid failed to " 8656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak "to set the effective uid to %d", ltpuser->pw_uid); 8756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak perror("setuid"); 8856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 895901ff4b9d18b497eb72630f3b5654e14cb274f0robbiew 90865695bbc89088b9526ea9045410e5afb70a985cplars tst_sig(FORK, DEF_HANDLER, cleanup); 91865695bbc89088b9526ea9045410e5afb70a985cplars 92865695bbc89088b9526ea9045410e5afb70a985cplars umask(0); 93865695bbc89088b9526ea9045410e5afb70a985cplars 94865695bbc89088b9526ea9045410e5afb70a985cplars TEST_PAUSE; 95865695bbc89088b9526ea9045410e5afb70a985cplars} 96865695bbc89088b9526ea9045410e5afb70a985cplars 977dc42c97696f135e1fef92e612ecc66bf8d74318Cyril Hrubisstatic void cleanup(void) 98865695bbc89088b9526ea9045410e5afb70a985cplars{ 99ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman} 100