Bug 1386404 - Only do the tmp remapping if needed. r?jld draft
authorGian-Carlo Pascutto <gcp@mozilla.com>
Thu, 26 Oct 2017 18:02:10 +0200
changeset 749380 8f60c28b351faff34842ab0aa4dc0a6ff2604cab
parent 749379 33efd3bf5e4bfa849fcec9d158c0844387a45dc8
child 749381 b39d5fecfea05b0bce6aebd50d922d9fe49aa98f
push id97374
push usergpascutto@mozilla.com
push dateWed, 31 Jan 2018 09:19:12 +0000
reviewersjld
bugs1386404
milestone60.0a1
Bug 1386404 - Only do the tmp remapping if needed. r?jld This helps with getting the tests that are running out of /tmp to pass, who get confused if their paths change underneath them. It's also a bit faster. MozReview-Commit-ID: CWtngVNhA0t
security/sandbox/linux/broker/SandboxBroker.cpp
--- a/security/sandbox/linux/broker/SandboxBroker.cpp
+++ b/security/sandbox/linux/broker/SandboxBroker.cpp
@@ -701,28 +701,32 @@ SandboxBroker::ThreadMain(void)
       // enforced below.
       strncpy(pathBuf2, recvBuf + first_len + 1, kMaxPathLen + 1);
 
       // First string is guaranteed to be 0-terminated.
       pathLen = first_len;
 
       // Look up the first pathname but first translate relative paths.
       pathLen = ConvertToRealPath(pathBuf, sizeof(pathBuf), pathLen);
-      pathLen = RemapTempDirs(pathBuf, sizeof(pathBuf), pathLen);
       perms = mPolicy->Lookup(nsDependentCString(pathBuf, pathLen));
 
       // We don't have read permissions on the requested dir.
-      // Did we arrive from a symlink in a path that is not writable?
-      // Then try to figure out the original path and see if that is readable.
       if (!(perms & MAY_READ)) {
-          // Work on the original path,
-          // this reverses ConvertToRealPath above.
-          int symlinkPerms = SymlinkPermissions(recvBuf, first_len);
-          if (symlinkPerms > 0) {
-            perms = symlinkPerms;
+          // Was it a tempdir that we can remap?
+          pathLen = RemapTempDirs(pathBuf, sizeof(pathBuf), pathLen);
+          perms = mPolicy->Lookup(nsDependentCString(pathBuf, pathLen));
+          if (!(perms & MAY_READ)) {
+            // Did we arrive from a symlink in a path that is not writable?
+            // Then try to figure out the original path and see if that is
+            // readable. Work on the original path, this reverses
+            // ConvertToRealPath above.
+            int symlinkPerms = SymlinkPermissions(recvBuf, first_len);
+            if (symlinkPerms > 0) {
+              perms = symlinkPerms;
+            }
           }
       }
 
       // Same for the second path.
       pathLen2 = strnlen(pathBuf2, kMaxPathLen);
       if (pathLen2 > 0) {
         // Force 0 termination.
         pathBuf2[pathLen2] = '\0';