robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 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 |
Wanlong Gao | fed9641 | 2012-10-24 10:10:29 +0800 | [diff] [blame] | 13 | * with this program; if not, write the Free Software Foundation, Inc., |
| 14 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 15 | * |
| 16 | */ |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 17 | |
| 18 | /* |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 19 | * DESCRIPTION |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 20 | * Check for basic mount(2) system call flags. |
subrata_modak | 4bb656a | 2009-02-26 12:02:09 +0000 | [diff] [blame] | 21 | * |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 22 | * Verify that mount(2) syscall passes for each flag setting and validate |
| 23 | * the flags |
| 24 | * 1) MS_RDONLY - mount read-only. |
| 25 | * 2) MS_NODEV - disallow access to device special files. |
| 26 | * 3) MS_NOEXEC - disallow program execution. |
| 27 | * 4) MS_SYNCHRONOUS - writes are synced at once. |
| 28 | * 5) MS_REMOUNT - alter flags of a mounted FS. |
| 29 | * 6) MS_NOSUID - ignore suid and sgid bits. |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 30 | * 7) MS_NOATIME - do not update access times. |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 31 | */ |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 32 | |
vapier | 5b31d1b | 2006-08-21 06:46:26 +0000 | [diff] [blame] | 33 | #ifndef _GNU_SOURCE |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 34 | #define _GNU_SOURCE |
vapier | 5b31d1b | 2006-08-21 06:46:26 +0000 | [diff] [blame] | 35 | #endif |
| 36 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 37 | #include <sys/types.h> |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 38 | #include <sys/mount.h> |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 39 | #include <sys/stat.h> |
| 40 | #include <sys/wait.h> |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 41 | #include <assert.h> |
| 42 | #include <errno.h> |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 43 | #include <fcntl.h> |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 44 | #include <pwd.h> |
vapier | 5b31d1b | 2006-08-21 06:46:26 +0000 | [diff] [blame] | 45 | #include <unistd.h> |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 46 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 47 | #include "test.h" |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 48 | #include "safe_macros.h" |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 49 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 50 | static void setup(void); |
| 51 | static void cleanup(void); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 52 | static int test_rwflag(int, int); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 53 | |
Cyril Hrubis | fdce7d5 | 2013-04-04 18:35:48 +0200 | [diff] [blame] | 54 | char *TCID = "mount03"; |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 55 | int TST_TOTAL = 7; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 56 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 57 | #define TEMP_FILE "temp_file" |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 58 | #define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 59 | #define DIR_MODE (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP| \ |
| 60 | S_IXGRP|S_IROTH|S_IXOTH) |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 61 | #define SUID_MODE (S_ISUID|S_IRUSR|S_IXUSR|S_IXGRP|S_IXOTH) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 62 | |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 63 | static const char mntpoint[] = "mntpoint"; |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 64 | static const char *device; |
| 65 | static const char *fs_type; |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 66 | static int fildes; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 67 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 68 | static char write_buffer[BUFSIZ]; |
| 69 | static char read_buffer[BUFSIZ]; |
| 70 | static char path_name[PATH_MAX]; |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 71 | static char file[PATH_MAX]; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 72 | |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 73 | long rwflags[] = { |
| 74 | MS_RDONLY, |
| 75 | MS_NODEV, |
| 76 | MS_NOEXEC, |
| 77 | MS_SYNCHRONOUS, |
| 78 | MS_RDONLY, |
| 79 | MS_NOSUID, |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 80 | MS_NOATIME, |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 81 | }; |
| 82 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 83 | int main(int argc, char *argv[]) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 84 | { |
Cyril Hrubis | 89af32a | 2012-10-24 16:39:11 +0200 | [diff] [blame] | 85 | int lc, i; |
Cyril Hrubis | 0b9589f | 2014-05-27 17:40:33 +0200 | [diff] [blame] | 86 | const char *msg; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 87 | |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 88 | msg = parse_opts(argc, argv, NULL, NULL); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 89 | if (msg != NULL) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 90 | tst_brkm(TBROK, NULL, "OPTION PARSING ERROR - %s", msg); |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 91 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 92 | setup(); |
| 93 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 94 | for (lc = 0; TEST_LOOPING(lc); lc++) { |
| 95 | |
Caspar Zhang | d59a659 | 2013-03-07 14:59:12 +0800 | [diff] [blame] | 96 | tst_count = 0; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 97 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 98 | for (i = 0; i < TST_TOTAL; ++i) { |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 99 | |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 100 | TEST(mount(device, mntpoint, fs_type, rwflags[i], |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 101 | NULL)); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 102 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 103 | if (TEST_RETURN != 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 104 | tst_resm(TFAIL | TTERRNO, "mount(2) failed"); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 105 | continue; |
| 106 | } |
| 107 | |
| 108 | /* Validate the rwflag */ |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 109 | if (test_rwflag(i, lc) == 1) |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 110 | tst_resm(TFAIL, "mount(2) failed while" |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 111 | " validating %ld", rwflags[i]); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 112 | else |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 113 | tst_resm(TPASS, "mount(2) passed with " |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 114 | "rwflag = %ld", rwflags[i]); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 115 | |
Cyril Hrubis | c60a230 | 2015-01-29 16:28:24 +0100 | [diff] [blame] | 116 | TEST(tst_umount(mntpoint)); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 117 | if (TEST_RETURN != 0) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 118 | tst_brkm(TBROK | TTERRNO, cleanup, |
| 119 | "umount(2) failed for %s", mntpoint); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 120 | } |
| 121 | } |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 122 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 123 | cleanup(); |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 124 | tst_exit(); |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 125 | } |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 126 | |
| 127 | /* |
| 128 | * test_rwflag(int i, int cnt) |
| 129 | * Validate the mount system call for rwflags. |
| 130 | */ |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 131 | int test_rwflag(int i, int cnt) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 132 | { |
DAN LI | 24324ad | 2013-05-14 10:40:28 +0800 | [diff] [blame] | 133 | int ret, fd, pid, status; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 134 | char nobody_uid[] = "nobody"; |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 135 | time_t atime; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 136 | struct passwd *ltpuser; |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 137 | struct stat file_stat; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 138 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 139 | switch (i) { |
| 140 | case 0: |
| 141 | /* Validate MS_RDONLY flag of mount call */ |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 142 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 143 | snprintf(file, PATH_MAX, "%stmp", path_name); |
| 144 | fd = open(file, O_CREAT | O_RDWR, S_IRWXU); |
| 145 | if (fd == -1) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 146 | if (errno == EROFS) { |
| 147 | return 0; |
| 148 | } else { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 149 | tst_resm(TWARN | TERRNO, |
| 150 | "open didn't fail with EROFS"); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 151 | return 1; |
| 152 | } |
| 153 | } |
| 154 | close(fd); |
| 155 | return 1; |
| 156 | case 1: |
| 157 | /* Validate MS_NODEV flag of mount call */ |
| 158 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 159 | snprintf(file, PATH_MAX, "%smynod_%d_%d", path_name, getpid(), |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 160 | cnt); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 161 | if (mknod(file, S_IFBLK | 0777, 0) == 0) { |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 162 | fd = open(file, O_RDWR, S_IRWXU); |
| 163 | if (fd == -1) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 164 | if (errno == EACCES) { |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 165 | return 0; |
| 166 | } else { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 167 | tst_resm(TWARN | TERRNO, |
| 168 | "open didn't fail with EACCES"); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 169 | return 1; |
| 170 | } |
| 171 | } |
| 172 | close(fd); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 173 | } else { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 174 | tst_resm(TWARN | TERRNO, "mknod(2) failed to create %s", |
| 175 | file); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 176 | return 1; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 177 | } |
| 178 | return 1; |
| 179 | case 2: |
| 180 | /* Validate MS_NOEXEC flag of mount call */ |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 181 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 182 | snprintf(file, PATH_MAX, "%stmp1", path_name); |
| 183 | fd = open(file, O_CREAT | O_RDWR, S_IRWXU); |
| 184 | if (fd == -1) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 185 | tst_resm(TWARN | TERRNO, "opening %s failed", file); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 186 | } else { |
| 187 | close(fd); |
DAN LI | 24324ad | 2013-05-14 10:40:28 +0800 | [diff] [blame] | 188 | ret = execlp(file, basename(file), NULL); |
| 189 | if ((ret == -1) && (errno == EACCES)) |
| 190 | return 0; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 191 | } |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 192 | return 1; |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 193 | case 3: |
| 194 | /* |
| 195 | * Validate MS_SYNCHRONOUS flag of mount call. |
| 196 | * Copy some data into data buffer. |
| 197 | */ |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 198 | |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 199 | strcpy(write_buffer, "abcdefghijklmnopqrstuvwxyz"); |
| 200 | |
| 201 | /* Creat a temporary file under above directory */ |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 202 | snprintf(file, PATH_MAX, "%s%s", path_name, TEMP_FILE); |
| 203 | fildes = open(file, O_RDWR | O_CREAT, FILE_MODE); |
| 204 | if (fildes == -1) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 205 | tst_resm(TWARN | TERRNO, |
| 206 | "open(%s, O_RDWR|O_CREAT, %#o) failed", |
| 207 | file, FILE_MODE); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 208 | return 1; |
| 209 | } |
| 210 | |
| 211 | /* Write the buffer data into file */ |
| 212 | if (write(fildes, write_buffer, strlen(write_buffer)) != |
| 213 | strlen(write_buffer)) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 214 | tst_resm(TWARN | TERRNO, "writing to %s failed", file); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 215 | close(fildes); |
| 216 | return 1; |
| 217 | } |
| 218 | |
| 219 | /* Set the file ptr to b'nning of file */ |
| 220 | if (lseek(fildes, 0, SEEK_SET) < 0) { |
| 221 | tst_resm(TWARN, "lseek() failed on %s, error=" |
| 222 | " %d", file, errno); |
| 223 | close(fildes); |
| 224 | return 1; |
| 225 | } |
| 226 | |
| 227 | /* Read the contents of file */ |
| 228 | if (read(fildes, read_buffer, sizeof(read_buffer)) > 0) { |
| 229 | if (strcmp(read_buffer, write_buffer)) { |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 230 | tst_resm(TWARN, "Data read from %s and written " |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 231 | "mismatch", file); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 232 | close(fildes); |
| 233 | return 1; |
| 234 | } else { |
| 235 | close(fildes); |
| 236 | return 0; |
| 237 | } |
| 238 | } else { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 239 | tst_resm(TWARN | TERRNO, "read() Fails on %s", file); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 240 | close(fildes); |
| 241 | return 1; |
| 242 | } |
| 243 | |
| 244 | case 4: |
| 245 | /* Validate MS_REMOUNT flag of mount call */ |
| 246 | |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 247 | TEST(mount(device, mntpoint, fs_type, MS_REMOUNT, NULL)); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 248 | if (TEST_RETURN != 0) { |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 249 | tst_resm(TWARN | TTERRNO, "mount(2) failed to remount"); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 250 | return 1; |
| 251 | } else { |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 252 | snprintf(file, PATH_MAX, "%stmp2", path_name); |
| 253 | fd = open(file, O_CREAT | O_RDWR, S_IRWXU); |
| 254 | if (fd == -1) { |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 255 | tst_resm(TWARN, "open(%s) on readonly " |
| 256 | "filesystem passed", file); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 257 | return 1; |
| 258 | } else { |
| 259 | close(fd); |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 260 | return 0; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 261 | } |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 262 | } |
| 263 | case 5: |
| 264 | /* Validate MS_NOSUID flag of mount call */ |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 265 | |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 266 | snprintf(file, PATH_MAX, "%ssetuid_test", path_name); |
| 267 | SAFE_FILE_PRINTF(cleanup, file, "TEST FILE"); |
| 268 | |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 269 | if (stat(file, &file_stat) < 0) |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 270 | tst_brkm(TBROK, cleanup, "stat for setuid_test failed"); |
| 271 | |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 272 | if (file_stat.st_mode != SUID_MODE && |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 273 | chmod(file, SUID_MODE) < 0) |
| 274 | tst_brkm(TBROK, cleanup, |
| 275 | "setuid for setuid_test failed"); |
| 276 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 277 | pid = fork(); |
| 278 | switch (pid) { |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 279 | case -1: |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 280 | tst_resm(TBROK | TERRNO, "fork failed"); |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 281 | return 1; |
| 282 | case 0: |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 283 | ltpuser = getpwnam(nobody_uid); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 284 | if (setreuid(ltpuser->pw_uid, ltpuser->pw_uid) == -1) |
Wanlong Gao | 354ebb4 | 2012-12-07 10:10:04 +0800 | [diff] [blame] | 285 | tst_resm(TWARN | TERRNO, |
| 286 | "seteuid() failed to change euid to %d", |
| 287 | ltpuser->pw_uid); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 288 | |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 289 | execlp(file, basename(file), NULL); |
| 290 | exit(1); |
| 291 | default: |
subrata_modak | 56207ce | 2009-03-23 13:35:39 +0000 | [diff] [blame] | 292 | waitpid(pid, &status, 0); |
| 293 | if (WIFEXITED(status)) { |
| 294 | /* reset the setup_uid */ |
| 295 | if (status) |
| 296 | return 0; |
| 297 | else |
| 298 | return 1; |
| 299 | } |
| 300 | } |
DAN LI | 59e542b | 2013-07-08 13:18:48 +0800 | [diff] [blame] | 301 | case 6: |
| 302 | /* Validate MS_NOATIME flag of mount call */ |
| 303 | |
| 304 | snprintf(file, PATH_MAX, "%satime", path_name); |
| 305 | fd = open(file, O_CREAT | O_RDWR, S_IRWXU); |
| 306 | if (fd == -1) { |
| 307 | tst_resm(TWARN | TERRNO, "opening %s failed", file); |
| 308 | return 1; |
| 309 | } |
| 310 | |
| 311 | if (write(fd, "TEST_MS_NOATIME", 15) != 15) { |
| 312 | tst_resm(TWARN | TERRNO, "write %s failed", file); |
| 313 | return 1; |
| 314 | } |
| 315 | |
| 316 | if (fstat(fd, &file_stat) == -1) { |
| 317 | tst_resm(TWARN | TERRNO, "stat %s failed #1", file); |
| 318 | return 1; |
| 319 | } |
| 320 | |
| 321 | atime = file_stat.st_atime; |
| 322 | |
| 323 | sleep(1); |
| 324 | |
| 325 | if (read(fd, NULL, 20) == -1) { |
| 326 | tst_resm(TWARN | TERRNO, "read %s failed", file); |
| 327 | return 1; |
| 328 | } |
| 329 | |
| 330 | if (fstat(fd, &file_stat) == -1) { |
| 331 | tst_resm(TWARN | TERRNO, "stat %s failed #2", file); |
| 332 | return 1; |
| 333 | } |
| 334 | close(fd); |
| 335 | |
| 336 | if (file_stat.st_atime != atime) { |
| 337 | tst_resm(TWARN, "access time is updated"); |
| 338 | return 1; |
| 339 | } |
| 340 | return 0; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 341 | } |
| 342 | return 0; |
| 343 | } |
| 344 | |
Cyril Hrubis | 629a1ac | 2013-08-08 17:24:04 +0200 | [diff] [blame] | 345 | static void setup(void) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 346 | { |
DAN LI | 24324ad | 2013-05-14 10:40:28 +0800 | [diff] [blame] | 347 | char path[PATH_MAX]; |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 348 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 349 | tst_sig(FORK, DEF_HANDLER, cleanup); |
| 350 | |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 351 | tst_require_root(NULL); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 352 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 353 | tst_tmpdir(); |
| 354 | |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 355 | fs_type = tst_dev_fs_type(); |
| 356 | device = tst_acquire_device(cleanup); |
| 357 | |
| 358 | if (!device) |
| 359 | tst_brkm(TCONF, cleanup, "Failed to obtain block device"); |
| 360 | |
| 361 | tst_mkfs(cleanup, device, fs_type, NULL); |
| 362 | |
DAN LI | a4d106d | 2013-07-08 13:17:23 +0800 | [diff] [blame] | 363 | SAFE_MKDIR(cleanup, mntpoint, DIR_MODE); |
DAN LI | 24324ad | 2013-05-14 10:40:28 +0800 | [diff] [blame] | 364 | |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 365 | if (getcwd(path_name, sizeof(path_name)) == NULL) |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 366 | tst_brkm(TBROK, cleanup, "getcwd failed"); |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 367 | |
| 368 | if (chmod(path_name, DIR_MODE) != 0) |
Garrett Cooper | 2ddcc1b | 2010-12-13 20:47:00 -0800 | [diff] [blame] | 369 | tst_brkm(TBROK, cleanup, "chmod(%s, %#o) failed", |
DAN LI | 6dcafa7 | 2013-05-14 10:31:15 +0800 | [diff] [blame] | 370 | path_name, DIR_MODE); |
| 371 | |
DAN LI | 24324ad | 2013-05-14 10:40:28 +0800 | [diff] [blame] | 372 | strncpy(path, path_name, PATH_MAX); |
| 373 | snprintf(path_name, PATH_MAX, "%s/%s/", path, mntpoint); |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 374 | |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 375 | TEST_PAUSE; |
Garrett Cooper | 2c28215 | 2010-12-16 00:55:50 -0800 | [diff] [blame] | 376 | } |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 377 | |
Cyril Hrubis | 629a1ac | 2013-08-08 17:24:04 +0200 | [diff] [blame] | 378 | static void cleanup(void) |
robbiew | 1d89ad5 | 2006-01-31 15:12:47 +0000 | [diff] [blame] | 379 | { |
Cyril Hrubis | 9141659 | 2014-08-13 14:37:49 +0200 | [diff] [blame] | 380 | if (device) |
| 381 | tst_release_device(NULL, device); |
| 382 | |
| 383 | tst_rmdir(); |
Chris Dearman | ec6edca | 2012-10-17 19:54:01 -0700 | [diff] [blame] | 384 | } |