Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(392)

Side by Side Diff: tests/limited_file_access/limited_file_access.cc

Issue 1690983004: Extended restricted filesystem to support relative paths. (Closed) Base URL: https://chromium.googlesource.com/native_client/src/native_client.git@master
Patch Set: Allow relative paths without prepending CWD Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
Mark Seaborn 2016/02/24 21:19:19 If I comment out the call to NaClHostDescChdir() i
Sean Klein 2016/02/24 23:40:43 Updated the first test to verify the cwd before ca
Mark Seaborn 2016/02/25 01:18:09 Can you also add a comment to that code in sel_mai
Sean Klein 2016/02/25 01:36:28 Done.
7 /* 7 /*
8 * NaCl tests for limited file access 8 * NaCl tests for limited file access
9 */ 9 */
10 10
11 #include <dirent.h> 11 #include <dirent.h>
12 #include <errno.h> 12 #include <errno.h>
13 #include <fcntl.h> 13 #include <fcntl.h>
14 #include <limits.h> 14 #include <limits.h>
15 #include <stdlib.h> 15 #include <stdlib.h>
16 #include <stdio.h> 16 #include <stdio.h>
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 } 120 }
121 ASSERT_EQ_MSG(closedir(d), 0, "closedir() failed"); 121 ASSERT_EQ_MSG(closedir(d), 0, "closedir() failed");
122 122
123 ASSERT(temp_file_seen); 123 ASSERT(temp_file_seen);
124 ASSERT(temp_symlink_seen); 124 ASSERT(temp_symlink_seen);
125 ASSERT(sub_temp_dir_seen); 125 ASSERT(sub_temp_dir_seen);
126 ASSERT(parent_directory_seen); 126 ASSERT(parent_directory_seen);
127 ASSERT(current_directory_seen); 127 ASSERT(current_directory_seen);
128 ASSERT_EQ(count, 5); 128 ASSERT_EQ(count, 5);
129 129
130 // Chdir with relative path name
131 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_name), 0, "chdir() failed");
132 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed");
133 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0);
134
135 // Chdir with absolute path name
130 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_path), 0, "chdir() failed"); 136 ASSERT_EQ_MSG(chdir(g_temp_sub_dir_path), 0, "chdir() failed");
131 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed"); 137 ASSERT_NE_MSG(getcwd(dirname, PATH_MAX), NULL, "getcwd() failed");
132 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0); 138 ASSERT_EQ(strcmp(dirname, g_temp_sub_dir_path), 0);
139
133 d = opendir(dirname); 140 d = opendir(dirname);
134 count = 0; 141 count = 0;
135 142
136 /* 143 /*
137 * We expect to see: 144 * We expect to see:
138 * temp_sub_file 145 * temp_sub_file
139 * .. 146 * ..
140 * . 147 * .
141 */ 148 */
142 149
(...skipping 30 matching lines...) Expand all
173 180
174 void test_new_directory_access() { 181 void test_new_directory_access() {
175 // Create a new directory, removes that directory. 182 // Create a new directory, removes that directory.
176 mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR; 183 mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR;
177 ASSERT_EQ(mkdir("/test_dir", mode), 0); 184 ASSERT_EQ(mkdir("/test_dir", mode), 0);
178 ASSERT_EQ(rmdir("/test_dir"), 0); 185 ASSERT_EQ(rmdir("/test_dir"), 0);
179 186
180 ASSERT_EQ(mkdir("/test_dir/", mode), 0); 187 ASSERT_EQ(mkdir("/test_dir/", mode), 0);
181 ASSERT_EQ(rmdir("/test_dir/"), 0); 188 ASSERT_EQ(rmdir("/test_dir/"), 0);
182 189
183 // Cannot make directory using relative path. 190 // Test that relative paths can also be used.
184 ASSERT_EQ(mkdir("test_dir/", mode), -1); 191 ASSERT_EQ(mkdir("test_dir", mode), 0);
185 ASSERT_EQ(errno, EACCES); 192 ASSERT_EQ(rmdir("test_dir"), 0);
186 193
187 char file_name[PATH_MAX]; 194 char file_name[PATH_MAX];
188 snprintf(file_name, PATH_MAX, "%s/test_dir", g_temp_sub_dir_path); 195 snprintf(file_name, PATH_MAX, "%s/test_dir", g_temp_sub_dir_path);
189 ASSERT_EQ(mkdir(file_name, mode), 0); 196 ASSERT_EQ(mkdir(file_name, mode), 0);
190 ASSERT_EQ(rmdir(file_name), 0); 197 ASSERT_EQ(rmdir(file_name), 0);
191 198
192 ASSERT_NE(mkdir("/this_dir_does_not_exist/sub_dir", mode), 0); 199 ASSERT_NE(mkdir("/this_dir_does_not_exist/sub_dir", mode), 0);
193 passed("test_new_directory_access", "all"); 200 passed("test_new_directory_access", "all");
194 } 201 }
195 202
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 // information leak could also lead to discovering directories and files 298 // information leak could also lead to discovering directories and files
292 // outside the mount point. 299 // outside the mount point.
293 char path[PATH_MAX]; 300 char path[PATH_MAX];
294 struct stat buf; 301 struct stat buf;
295 302
296 // We should be able to access the root directory. 303 // We should be able to access the root directory.
297 ASSERT_EQ(stat("/", &buf), 0); 304 ASSERT_EQ(stat("/", &buf), 0);
298 ASSERT_EQ(stat("//", &buf), 0); 305 ASSERT_EQ(stat("//", &buf), 0);
299 ASSERT_EQ(stat("/./.", &buf), 0); 306 ASSERT_EQ(stat("/./.", &buf), 0);
300 ASSERT_EQ(stat("/./////.", &buf), 0); 307 ASSERT_EQ(stat("/./////.", &buf), 0);
301 308 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 309
306 // We should not be able to access paths containing "..". 310 // We should not be able to access paths containing "..".
307 snprintf(path, PATH_MAX, "%s/..", g_temp_sub_dir_path); 311 snprintf(path, PATH_MAX, "%s/..", g_temp_sub_dir_path);
308 ASSERT_EQ(stat(path, &buf), -1); 312 ASSERT_EQ(stat(path, &buf), -1);
309 ASSERT_EQ(errno, EACCES); 313 ASSERT_EQ(errno, EACCES);
310 314
311 // We should not be able to access the parent of the root directory. 315 // We should not be able to access the parent of the root directory.
312 ASSERT_EQ(stat("/..", &buf), -1); 316 ASSERT_EQ(stat("/..", &buf), -1);
313 ASSERT_EQ(errno, EACCES); 317 ASSERT_EQ(errno, EACCES);
314 318
315 // We should not be able to identify our mount point this way. 319 // We should not be able to identify our mount point this way.
316 snprintf(path, PATH_MAX, "/../%s", g_temp_dir_name); 320 snprintf(path, PATH_MAX, "/../%s", g_temp_dir_name);
317 ASSERT_EQ(stat(path, &buf), -1); 321 ASSERT_EQ(stat(path, &buf), -1);
318 ASSERT_EQ(errno, EACCES); 322 ASSERT_EQ(errno, EACCES);
319 snprintf(path, PATH_MAX, "//../%s", g_temp_dir_name); 323 snprintf(path, PATH_MAX, "//../%s", g_temp_dir_name);
320 ASSERT_EQ(stat(path, &buf), -1); 324 ASSERT_EQ(stat(path, &buf), -1);
321 ASSERT_EQ(errno, EACCES); 325 ASSERT_EQ(errno, EACCES);
322 snprintf(path, PATH_MAX, "/.//..//%s", g_temp_dir_name); 326 snprintf(path, PATH_MAX, "/.//..//%s", g_temp_dir_name);
323 ASSERT_EQ(stat(path, &buf), -1); 327 ASSERT_EQ(stat(path, &buf), -1);
324 ASSERT_EQ(errno, EACCES); 328 ASSERT_EQ(errno, EACCES);
325 329
326 passed("test_information_leak", "all"); 330 passed("test_information_leak", "all");
327 } 331 }
328 332
329 void test_valid_file_access() { 333 void test_valid_file_access() {
330 // Show that reads and writes to valid files work. 334 // Show that reads and writes to valid files work.
331 char file_name[PATH_MAX]; 335 char file_name[PATH_MAX];
336 bool new_file = false;
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);
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);
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);
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);
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);
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698