1 /*
2 * Copyright (c) Wipro Technologies Ltd, 2002. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it would be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 *
12 * You should have received a copy of the GNU General Public License along
13 * with this program; if not, write the Free Software Foundation, Inc.,
14 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
15 *
16 * AUTHOR : Nirmala Devi Dhanasekar <nirmala.devi@wipro.com>
17 *
18 * DESCRIPTION
19 * Verify that umount(2) returns -1 and sets errno to EPERM if the user
20 * is not the super-user.
21 *
22 * RESTRICTIONS
23 * test must be run with the -D option
24 * test doesn't support -c option to run it in parallel, as mount
25 * syscall is not supposed to run in parallel.
26 */
27
28 #include <errno.h>
29 #include <sys/mount.h>
30 #include <sys/types.h>
31 #include <sys/stat.h>
32 #include <sys/fcntl.h>
33 #include <sys/wait.h>
34 #include <pwd.h>
35
36 #include "test.h"
37 #include "safe_macros.h"
38
39 static void setup(void);
40 static void cleanup(void);
41
42 char *TCID = "umount03";
43
44 #define FSTYPE_LEN 20
45 #define DIR_MODE S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH
46 #define MNTPOINT "mntpoint"
47
48 static const char *device;
49 static int mount_flag;
50
51 int TST_TOTAL = 1;
52
main(int ac,char ** av)53 int main(int ac, char **av)
54 {
55 int lc;
56
57 tst_parse_opts(ac, av, NULL, NULL);
58
59 setup();
60
61 for (lc = 0; TEST_LOOPING(lc); lc++) {
62 tst_count = 0;
63
64 TEST(umount(MNTPOINT));
65
66 if (TEST_RETURN != -1) {
67 tst_resm(TFAIL, "umout() didn't fail (ret=%ld)",
68 TEST_RETURN);
69 continue;
70 }
71
72 if (TEST_ERRNO == EPERM) {
73 tst_resm(TPASS | TTERRNO, "umount() failed with EPERM");
74 } else {
75 tst_resm(TFAIL | TTERRNO,
76 "umount() did not fail with EPERM(%d)", EPERM);
77 }
78 }
79
80 cleanup();
81 tst_exit();
82 }
83
setup(void)84 static void setup(void)
85 {
86 const char *fs_type;
87 struct passwd *ltpuser;
88
89 tst_sig(FORK, DEF_HANDLER, cleanup);
90
91 tst_require_root();
92
93 ltpuser = SAFE_GETPWNAM(NULL, "nobody");
94
95 tst_tmpdir();
96
97 fs_type = tst_dev_fs_type();
98 device = tst_acquire_device(cleanup);
99 if (!device)
100 tst_brkm(TCONF, cleanup, "Failed to obtain block device");
101
102 tst_mkfs(cleanup, device, fs_type, NULL, NULL);
103
104 SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
105
106 if (mount(device, MNTPOINT, fs_type, 0, NULL))
107 tst_brkm(TBROK | TERRNO, cleanup, "mount() failed");
108 mount_flag = 1;
109
110 SAFE_SETEUID(cleanup, ltpuser->pw_uid);
111 TEST_PAUSE;
112 }
113
cleanup(void)114 static void cleanup(void)
115 {
116 if (seteuid(0))
117 tst_resm(TWARN | TERRNO, "seteuid(0) failed");
118
119 if (mount_flag && tst_umount(MNTPOINT))
120 tst_resm(TWARN | TERRNO, "umount() failed");
121
122 if (device)
123 tst_release_device(device);
124
125 tst_rmdir();
126 }
127