| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The Native Client Authors. All rights reserved. | 2 * Copyright 2016 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 /* | 7 /* |
| 8 * NaCl tests for limited file access | 8 * NaCl tests for limited file access |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 | 67 |
| 68 ASSERT_EQ(test_string_len, write(fd, test_string, test_string_len)); | 68 ASSERT_EQ(test_string_len, write(fd, test_string, test_string_len)); |
| 69 ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)); | 69 ASSERT_EQ(0, lseek(fd, 0, SEEK_SET)); |
| 70 ASSERT_EQ(test_string_len, read(fd, buf, test_string_len)); | 70 ASSERT_EQ(test_string_len, read(fd, buf, test_string_len)); |
| 71 ASSERT_EQ(0, memcmp(buf, test_string, test_string_len)); | 71 ASSERT_EQ(0, memcmp(buf, test_string, test_string_len)); |
| 72 ASSERT_EQ(0, close(fd)); | 72 ASSERT_EQ(0, close(fd)); |
| 73 } | 73 } |
| 74 | 74 |
| 75 void test_directory_walk() { | 75 void test_directory_walk() { |
| 76 // Attempt to walk down valid directory structure (and back again). | 76 // Attempt to walk down valid directory structure (and back again). |
| 77 ASSERT_EQ_MSG(chdir("/"), 0, "chdir() failed"); | |
| 78 | |
| 79 char dirname[PATH_MAX]; | 77 char dirname[PATH_MAX]; |
| 80 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); | 78 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); |
| 81 ASSERT_EQ(strcmp(dirname, "/"), 0); | 79 ASSERT_EQ(strcmp(dirname, "/"), 0); |
| 82 | 80 |
| 81 ASSERT_EQ_MSG(chdir("."), 0, "chdir() failed"); |
| 82 ASSERT_EQ_MSG(chdir("/"), 0, "chdir() failed"); |
| 83 |
| 83 DIR *d = opendir(dirname); | 84 DIR *d = opendir(dirname); |
| 84 ASSERT_NE_MSG(d, NULL, "opendir() failed"); | 85 ASSERT_NE_MSG(d, NULL, "opendir() failed"); |
| 85 int count = 0; | 86 int count = 0; |
| 86 struct dirent *ent; | 87 struct dirent *ent; |
| 87 | 88 |
| 88 /* | 89 /* |
| 89 * We expect to see: | 90 * We expect to see: |
| 90 * temp_file | 91 * temp_file |
| 91 * temp_symlink | 92 * temp_symlink |
| 92 * sub_temp_dir | 93 * sub_temp_dir |
| (...skipping 27 matching lines...) Expand all Loading... |
| 120 } | 121 } |
| 121 ASSERT_EQ_MSG(closedir(d), 0, "closedir() failed"); | 122 ASSERT_EQ_MSG(closedir(d), 0, "closedir() failed"); |
| 122 | 123 |
| 123 ASSERT(temp_file_seen); | 124 ASSERT(temp_file_seen); |
| 124 ASSERT(temp_symlink_seen); | 125 ASSERT(temp_symlink_seen); |
| 125 ASSERT(sub_temp_dir_seen); | 126 ASSERT(sub_temp_dir_seen); |
| 126 ASSERT(parent_directory_seen); | 127 ASSERT(parent_directory_seen); |
| 127 ASSERT(current_directory_seen); | 128 ASSERT(current_directory_seen); |
| 128 ASSERT_EQ(count, 5); | 129 ASSERT_EQ(count, 5); |
| 129 | 130 |
| 131 // Chdir with relative path name |
| 132 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_name), 0, "chdir() failed"); |
| 133 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); |
| 134 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0); |
| 135 |
| 136 // Chdir with absolute path name |
| 130 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_path), 0, "chdir() failed"); | 137 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_path), 0, "chdir() failed"); |
| 131 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); | 138 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); |
| 132 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0); | 139 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0); |
| 140 |
| 133 d = opendir(dirname); | 141 d = opendir(dirname); |
| 134 count = 0; | 142 count = 0; |
| 135 | 143 |
| 136 /* | 144 /* |
| 137 * We expect to see: | 145 * We expect to see: |
| 138 * temp_sub_file | 146 * temp_sub_file |
| 139 * .. | 147 * .. |
| 140 * . | 148 * . |
| 141 */ | 149 */ |
| 142 | 150 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 173 | 181 |
| 174 void test_new_directory_access() { | 182 void test_new_directory_access() { |
| 175 // Create a new directory, removes that directory. | 183 // Create a new directory, removes that directory. |
| 176 mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR; | 184 mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR; |
| 177 ASSERT_EQ(mkdir("/test_dir", mode), 0); | 185 ASSERT_EQ(mkdir("/test_dir", mode), 0); |
| 178 ASSERT_EQ(rmdir("/test_dir"), 0); | 186 ASSERT_EQ(rmdir("/test_dir"), 0); |
| 179 | 187 |
| 180 ASSERT_EQ(mkdir("/test_dir/", mode), 0); | 188 ASSERT_EQ(mkdir("/test_dir/", mode), 0); |
| 181 ASSERT_EQ(rmdir("/test_dir/"), 0); | 189 ASSERT_EQ(rmdir("/test_dir/"), 0); |
| 182 | 190 |
| 183 // Cannot make directory using relative path. | 191 // Test that relative paths can also be used. |
| 184 ASSERT_EQ(mkdir("test_dir/", mode), -1); | 192 ASSERT_EQ(mkdir("test_dir", mode), 0); |
| 185 ASSERT_EQ(errno, EACCES); | 193 ASSERT_EQ(rmdir("test_dir"), 0); |
| 186 | 194 |
| 187 char file_name[PATH_MAX]; | 195 char file_name[PATH_MAX]; |
| 188 snprintf(file_name, PATH_MAX, "%s/test_dir", g_temp_sub_dir_path); | 196 snprintf(file_name, PATH_MAX, "%s/test_dir", g_temp_sub_dir_path); |
| 189 ASSERT_EQ(mkdir(file_name, mode), 0); | 197 ASSERT_EQ(mkdir(file_name, mode), 0); |
| 190 ASSERT_EQ(rmdir(file_name), 0); | 198 ASSERT_EQ(rmdir(file_name), 0); |
| 191 | 199 |
| 192 ASSERT_NE(mkdir("/this_dir_does_not_exist/sub_dir", mode), 0); | 200 ASSERT_NE(mkdir("/this_dir_does_not_exist/sub_dir", mode), 0); |
| 193 passed("test_new_directory_access", "all"); | 201 passed("test_new_directory_access", "all"); |
| 194 } | 202 } |
| 195 | 203 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 // information leak could also lead to discovering directories and files | 299 // information leak could also lead to discovering directories and files |
| 292 // outside the mount point. | 300 // outside the mount point. |
| 293 char path[PATH_MAX]; | 301 char path[PATH_MAX]; |
| 294 struct stat buf; | 302 struct stat buf; |
| 295 | 303 |
| 296 // We should be able to access the root directory. | 304 // We should be able to access the root directory. |
| 297 ASSERT_EQ(stat("/", &buf), 0); | 305 ASSERT_EQ(stat("/", &buf), 0); |
| 298 ASSERT_EQ(stat("//", &buf), 0); | 306 ASSERT_EQ(stat("//", &buf), 0); |
| 299 ASSERT_EQ(stat("/./.", &buf), 0); | 307 ASSERT_EQ(stat("/./.", &buf), 0); |
| 300 ASSERT_EQ(stat("/./////.", &buf), 0); | 308 ASSERT_EQ(stat("/./////.", &buf), 0); |
| 301 | 309 ASSERT_EQ(stat(".", &buf), 0); |
| 302 // We should not be able to access relative paths. | |
| 303 ASSERT_EQ(stat(".", &buf), -1); | |
| 304 ASSERT_EQ(errno, EACCES); | |
| 305 | 310 |
| 306 // We should not be able to access paths containing "..". | 311 // We should not be able to access paths containing "..". |
| 307 snprintf(path, PATH_MAX, "%s/..", g_temp_sub_dir_path); | 312 snprintf(path, PATH_MAX, "%s/..", g_temp_sub_dir_path); |
| 308 ASSERT_EQ(stat(path, &buf), -1); | 313 ASSERT_EQ(stat(path, &buf), -1); |
| 309 ASSERT_EQ(errno, EACCES); | 314 ASSERT_EQ(errno, EACCES); |
| 310 | 315 |
| 311 // We should not be able to access the parent of the root directory. | 316 // We should not be able to access the parent of the root directory. |
| 312 ASSERT_EQ(stat("/..", &buf), -1); | 317 ASSERT_EQ(stat("/..", &buf), -1); |
| 313 ASSERT_EQ(errno, EACCES); | 318 ASSERT_EQ(errno, EACCES); |
| 314 | 319 |
| 315 // We should not be able to identify our mount point this way. | 320 // We should not be able to identify our mount point this way. |
| 316 snprintf(path, PATH_MAX, "/../%s", g_temp_dir_name); | 321 snprintf(path, PATH_MAX, "/../%s", g_temp_dir_name); |
| 317 ASSERT_EQ(stat(path, &buf), -1); | 322 ASSERT_EQ(stat(path, &buf), -1); |
| 318 ASSERT_EQ(errno, EACCES); | 323 ASSERT_EQ(errno, EACCES); |
| 319 snprintf(path, PATH_MAX, "//../%s", g_temp_dir_name); | 324 snprintf(path, PATH_MAX, "//../%s", g_temp_dir_name); |
| 320 ASSERT_EQ(stat(path, &buf), -1); | 325 ASSERT_EQ(stat(path, &buf), -1); |
| 321 ASSERT_EQ(errno, EACCES); | 326 ASSERT_EQ(errno, EACCES); |
| 322 snprintf(path, PATH_MAX, "/.//..//%s", g_temp_dir_name); | 327 snprintf(path, PATH_MAX, "/.//..//%s", g_temp_dir_name); |
| 323 ASSERT_EQ(stat(path, &buf), -1); | 328 ASSERT_EQ(stat(path, &buf), -1); |
| 324 ASSERT_EQ(errno, EACCES); | 329 ASSERT_EQ(errno, EACCES); |
| 325 | 330 |
| 326 passed("test_information_leak", "all"); | 331 passed("test_information_leak", "all"); |
| 327 } | 332 } |
| 328 | 333 |
| 329 void test_valid_file_access() { | 334 void test_valid_file_access() { |
| 330 // Show that reads and writes to valid files work. | 335 // Show that reads and writes to valid files work. |
| 331 char file_name[PATH_MAX]; | 336 char file_name[PATH_MAX]; |
| 332 | 337 |
| 338 // Absolute path |
| 333 snprintf(file_name, PATH_MAX, "%s", g_temp_file_path); | 339 snprintf(file_name, PATH_MAX, "%s", g_temp_file_path); |
| 334 do_test_write_read_file(file_name, false); | 340 do_test_write_read_file(file_name, /* new_file= */ false); |
| 335 | 341 |
| 342 // Relative path |
| 343 snprintf(file_name, PATH_MAX, "%s", g_temp_file_name); |
| 344 do_test_write_read_file(file_name, /* new_file= */ false); |
| 345 |
| 346 // Absolute path |
| 336 snprintf(file_name, PATH_MAX, "%s/%s", g_temp_sub_dir_path, | 347 snprintf(file_name, PATH_MAX, "%s/%s", g_temp_sub_dir_path, |
| 337 g_temp_sub_file_name); | 348 g_temp_sub_file_name); |
| 338 do_test_write_read_file(file_name, false); | 349 do_test_write_read_file(file_name, /* new_file= */ false); |
| 339 | 350 |
| 340 snprintf(file_name, PATH_MAX, "%s/%s", g_temp_sub_dir_path, | 351 // Relative path |
| 352 snprintf(file_name, PATH_MAX, "%s/%s", g_temp_sub_dir_name, |
| 341 g_temp_sub_file_name); | 353 g_temp_sub_file_name); |
| 342 do_test_write_read_file(file_name, false); | 354 do_test_write_read_file(file_name, /* new_file= */ false); |
| 355 |
| 356 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_name), 0, "chdir() failed"); |
| 357 |
| 358 // Relative path |
| 359 snprintf(file_name, PATH_MAX, "%s", g_temp_sub_file_name); |
| 360 do_test_write_read_file(file_name, /* new_file= */ false); |
| 343 | 361 |
| 344 passed("test_valid_file_access", "all"); | 362 passed("test_valid_file_access", "all"); |
| 345 } | 363 } |
| 346 | 364 |
| 347 void test_new_file_access() { | 365 void test_new_file_access() { |
| 348 // Create a new file, show that it is readable / writable. | 366 // Create a new file, show that it is readable / writable. |
| 349 char file_name[PATH_MAX]; | 367 char file_name[PATH_MAX]; |
| 350 do_test_write_read_file("/new_temp_file", true); | 368 do_test_write_read_file("/new_temp_file", true); |
| 351 | 369 |
| 352 snprintf(file_name, PATH_MAX, "%s/newer_temp_file", g_temp_sub_dir_path); | 370 snprintf(file_name, PATH_MAX, "%s/newer_temp_file", g_temp_sub_dir_path); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 g_temp_sub_dir_name, argv[5]); | 421 g_temp_sub_dir_name, argv[5]); |
| 404 | 422 |
| 405 snprintf(g_temp_inaccessible_dir_name, PATH_MAX, "%s", argv[6]); | 423 snprintf(g_temp_inaccessible_dir_name, PATH_MAX, "%s", argv[6]); |
| 406 snprintf(g_temp_inaccessible_file_name, PATH_MAX, "%s", argv[7]); | 424 snprintf(g_temp_inaccessible_file_name, PATH_MAX, "%s", argv[7]); |
| 407 | 425 |
| 408 // Run the full test suite. | 426 // Run the full test suite. |
| 409 testSuite(); | 427 testSuite(); |
| 410 printf("All tests PASSED\n"); | 428 printf("All tests PASSED\n"); |
| 411 exit(0); | 429 exit(0); |
| 412 } | 430 } |
| OLD | NEW |