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