Small extra validations on permission checks: reject "0" as a valid permission
mask and require the path be absolute.

Also add some per-file security owners to child_process_security_policy_impl.cc
since it is highly sensitive.

BUG=168634

Review URL: https://chromiumcodereview.appspot.com/11734030

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175390 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/content/browser/child_process_security_policy_unittest.cc b/content/browser/child_process_security_policy_unittest.cc
index 90befd6..e98b8411 100644
--- a/content/browser/child_process_security_policy_unittest.cc
+++ b/content/browser/child_process_security_policy_unittest.cc
@@ -20,6 +20,12 @@
 const int kRendererID = 42;
 const int kWorkerRendererID = kRendererID + 1;
 
+#if defined(FILE_PATH_USES_DRIVE_LETTERS)
+#define TEST_PATH(x) FILE_PATH_LITERAL("c:") FILE_PATH_LITERAL(x)
+#else
+#define TEST_PATH(x) FILE_PATH_LITERAL(x)
+#endif
+
 class ChildProcessSecurityPolicyTestBrowserClient
     : public TestContentBrowserClient {
  public:
@@ -294,21 +300,16 @@
 
   p->Add(kRendererID);
 
-  EXPECT_FALSE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
-  p->GrantReadFile(kRendererID, FilePath(FILE_PATH_LITERAL("/etc/passwd")));
-  EXPECT_TRUE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
-  EXPECT_FALSE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/shadow"))));
+  EXPECT_FALSE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
+  p->GrantReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd")));
+  EXPECT_TRUE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
+  EXPECT_FALSE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/shadow"))));
 
   p->Remove(kRendererID);
   p->Add(kRendererID);
 
-  EXPECT_FALSE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
-  EXPECT_FALSE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/shadow"))));
+  EXPECT_FALSE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
+  EXPECT_FALSE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/shadow"))));
 
   p->Remove(kRendererID);
 }
@@ -319,49 +320,40 @@
 
   p->Add(kRendererID);
 
-  EXPECT_FALSE(p->CanReadDirectory(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/"))));
-  p->GrantReadDirectory(kRendererID, FilePath(FILE_PATH_LITERAL("/etc/")));
-  EXPECT_TRUE(p->CanReadDirectory(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/"))));
-  EXPECT_TRUE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
+  EXPECT_FALSE(p->CanReadDirectory(kRendererID, FilePath(TEST_PATH("/etc/"))));
+  p->GrantReadDirectory(kRendererID, FilePath(TEST_PATH("/etc/")));
+  EXPECT_TRUE(p->CanReadDirectory(kRendererID, FilePath(TEST_PATH("/etc/"))));
+  EXPECT_TRUE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
 
   p->Remove(kRendererID);
   p->Add(kRendererID);
 
-  EXPECT_FALSE(p->CanReadDirectory(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/"))));
-  EXPECT_FALSE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
+  EXPECT_FALSE(p->CanReadDirectory(kRendererID, FilePath(TEST_PATH("/etc/"))));
+  EXPECT_FALSE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
 
   // Just granting read permission as a file doesn't imply reading as a
   // directory.
-  p->GrantReadFile(kRendererID, FilePath(FILE_PATH_LITERAL("/etc/")));
-  EXPECT_TRUE(p->CanReadFile(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/passwd"))));
-  EXPECT_FALSE(p->CanReadDirectory(kRendererID,
-      FilePath(FILE_PATH_LITERAL("/etc/"))));
+  p->GrantReadFile(kRendererID, FilePath(TEST_PATH("/etc/")));
+  EXPECT_TRUE(p->CanReadFile(kRendererID, FilePath(TEST_PATH("/etc/passwd"))));
+  EXPECT_FALSE(p->CanReadDirectory(kRendererID, FilePath(TEST_PATH("/etc/"))));
 
   p->Remove(kRendererID);
 }
 
 TEST_F(ChildProcessSecurityPolicyTest, FilePermissions) {
-  FilePath granted_file = FilePath(FILE_PATH_LITERAL("/home/joe"));
-  FilePath sibling_file = FilePath(FILE_PATH_LITERAL("/home/bob"));
-  FilePath child_file = FilePath(FILE_PATH_LITERAL("/home/joe/file"));
-  FilePath parent_file = FilePath(FILE_PATH_LITERAL("/home"));
-  FilePath parent_slash_file = FilePath(FILE_PATH_LITERAL("/home/"));
-  FilePath child_traversal1 = FilePath(
-      FILE_PATH_LITERAL("/home/joe/././file"));
+  FilePath granted_file = FilePath(TEST_PATH("/home/joe"));
+  FilePath sibling_file = FilePath(TEST_PATH("/home/bob"));
+  FilePath child_file = FilePath(TEST_PATH("/home/joe/file"));
+  FilePath parent_file = FilePath(TEST_PATH("/home"));
+  FilePath parent_slash_file = FilePath(TEST_PATH("/home/"));
+  FilePath child_traversal1 = FilePath(TEST_PATH("/home/joe/././file"));
   FilePath child_traversal2 = FilePath(
-      FILE_PATH_LITERAL("/home/joe/file/../otherfile"));
-  FilePath evil_traversal1 = FilePath(
-      FILE_PATH_LITERAL("/home/joe/../../etc/passwd"));
+      TEST_PATH("/home/joe/file/../otherfile"));
+  FilePath evil_traversal1 = FilePath(TEST_PATH("/home/joe/../../etc/passwd"));
   FilePath evil_traversal2 = FilePath(
-      FILE_PATH_LITERAL("/home/joe/./.././../etc/passwd"));
-  FilePath self_traversal = FilePath(
-      FILE_PATH_LITERAL("/home/joe/../joe/file"));
+      TEST_PATH("/home/joe/./.././../etc/passwd"));
+  FilePath self_traversal = FilePath(TEST_PATH("/home/joe/../joe/file"));
+  FilePath relative_file = FilePath(FILE_PATH_LITERAL("home/joe"));
 
   ChildProcessSecurityPolicyImpl* p =
       ChildProcessSecurityPolicyImpl::GetInstance();
@@ -386,6 +378,7 @@
                                        base::PLATFORM_FILE_READ));
   EXPECT_FALSE(p->HasPermissionsForFile(kRendererID, granted_file,
                                         base::PLATFORM_FILE_CREATE));
+  EXPECT_FALSE(p->HasPermissionsForFile(kRendererID, granted_file, 0));
   EXPECT_FALSE(p->HasPermissionsForFile(kRendererID, granted_file,
                                         base::PLATFORM_FILE_CREATE |
                                         base::PLATFORM_FILE_OPEN_TRUNCATED |
@@ -486,6 +479,13 @@
                                         base::PLATFORM_FILE_OPEN |
                                         base::PLATFORM_FILE_READ));
   p->Remove(kWorkerRendererID);
+
+  p->Add(kRendererID);
+  p->GrantPermissionsForFile(kRendererID, relative_file,
+                             base::PLATFORM_FILE_OPEN);
+  EXPECT_FALSE(p->HasPermissionsForFile(kRendererID, relative_file,
+                                        base::PLATFORM_FILE_OPEN));
+  p->Remove(kRendererID);
 }
 
 TEST_F(ChildProcessSecurityPolicyTest, CanServiceWebUIBindings) {
@@ -510,7 +510,7 @@
       ChildProcessSecurityPolicyImpl::GetInstance();
 
   GURL url("file:///etc/passwd");
-  FilePath file(FILE_PATH_LITERAL("/etc/passwd"));
+  FilePath file(TEST_PATH("/etc/passwd"));
 
   p->Add(kRendererID);