You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by om...@apache.org on 2011/03/04 04:31:10 UTC

svn commit: r1077023 - /hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java

Author: omalley
Date: Fri Mar  4 03:31:10 2011
New Revision: 1077023

URL: http://svn.apache.org/viewvc?rev=1077023&view=rev
Log:
commit e8ad50481cc3c67ec00fb1e4733a5bc5b58de8b1
Author: Arun C Murthy <ac...@apache.org>
Date:   Sun Oct 18 23:19:27 2009 -0700

    HADOOP:6304 from https://issues.apache.org/jira/secure/attachment/12422525/HADOOP-6304_yhadoop20.patch
    
    +++ b/YAHOO-CHANGES.txt
    +yahoo-hadoop-0.20.1-3041192001
    +
    +    HADOOP-6304. Use java.io.File.set{Readable|Writable|Executable} where
    +    possible in RawLocalFileSystem. Contributed by Arun C. Murthy.
    +

Modified:
    hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java

Modified: hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java?rev=1077023&r1=1077022&r2=1077023&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java (original)
+++ hadoop/common/branches/branch-0.20-security-patches/src/core/org/apache/hadoop/fs/RawLocalFileSystem.java Fri Mar  4 03:31:10 2011
@@ -470,10 +470,59 @@ public class RawLocalFileSystem extends 
   @Override
   public void setPermission(Path p, FsPermission permission
       ) throws IOException {
-    execCommand(pathToFile(p), Shell.SET_PERMISSION_COMMAND,
-        String.format("%04o", permission.toShort()));
+    FsAction user = permission.getUserAction();
+    FsAction group = permission.getGroupAction();
+    FsAction other = permission.getOtherAction();
+    
+    File f = pathToFile(p);
+    
+    // Fork chmod if group and other permissions are different...
+    if (group != other) {
+      execSetPermission(f, permission);
+      return;
+    }
+    
+    boolean rv = true;
+    
+    // read perms
+    rv = f.setReadable(group.implies(FsAction.READ), false);
+    checkReturnValue(rv, p, permission);
+    if (group.implies(FsAction.READ) != user.implies(FsAction.READ)) {
+      f.setReadable(user.implies(FsAction.READ), true);
+      checkReturnValue(rv, p, permission);
+    }
+
+    // write perms
+    rv = f.setWritable(group.implies(FsAction.WRITE), false);
+    checkReturnValue(rv, p, permission);
+    if (group.implies(FsAction.WRITE) != user.implies(FsAction.WRITE)) {
+      f.setWritable(user.implies(FsAction.WRITE), true);
+      checkReturnValue(rv, p, permission);
+    }
+
+    // exec perms
+    rv = f.setExecutable(group.implies(FsAction.EXECUTE), false);
+    checkReturnValue(rv, p, permission);
+    if (group.implies(FsAction.EXECUTE) != user.implies(FsAction.EXECUTE)) {
+      f.setExecutable(user.implies(FsAction.EXECUTE), true);
+      checkReturnValue(rv, p, permission);
+    }
   }
 
+  private void checkReturnValue(boolean rv, Path p, FsPermission permission) 
+  throws IOException {
+    if (!rv) {
+      throw new IOException("Failed to set permissions of path: " + p + " to " + 
+                            String.format("%04o", permission.toShort()));
+    }
+  }
+  
+  private void execSetPermission(File f, FsPermission permission) 
+  throws IOException {
+    execCommand(f, Shell.SET_PERMISSION_COMMAND,
+        String.format("%04o", permission.toShort()));
+  }
+  
   private static String execCommand(File f, String... cmd) throws IOException {
     String[] args = new String[cmd.length + 1];
     System.arraycopy(cmd, 0, args, 0, cmd.length);