diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java index 45876a7885c..0b284b9a7d7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSPermissionChecker.java @@ -573,7 +573,9 @@ public void checkPermission(CachePool pool, FsAction access) && mode.getGroupAction().implies(access)) { return; } - if (mode.getOtherAction().implies(access)) { + if (!getUser().equals(pool.getOwnerName()) + && !isMemberOfGroup(pool.getGroupName()) + && mode.getOtherAction().implies(access)) { return; } throw new AccessControlException("Permission denied while accessing pool " diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestCacheDirectives.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestCacheDirectives.java index 658e4ca3dd7..c58e0903330 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestCacheDirectives.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestCacheDirectives.java @@ -420,6 +420,9 @@ public void testAddRemoveDirectives() throws Exception { setMode(new FsPermission((short)0777))); proto.addCachePool(new CachePoolInfo("pool4"). setMode(new FsPermission((short)0))); + proto.addCachePool(new CachePoolInfo("pool5"). + setMode(new FsPermission((short)0007)) + .setOwnerName(unprivilegedUser.getShortUserName())); CacheDirectiveInfo alpha = new CacheDirectiveInfo.Builder(). setPath(new Path("/alpha")). @@ -488,6 +491,18 @@ public void testAddRemoveDirectives() throws Exception { long deltaId = addAsUnprivileged(delta); + try { + addAsUnprivileged(new CacheDirectiveInfo.Builder(). + setPath(new Path("/epsilon")). + setPool("pool5"). + build()); + fail("expected an error when adding to a pool with " + + "mode 007 (no permissions for pool owner)."); + } catch (AccessControlException e) { + GenericTestUtils. + assertExceptionContains("Permission denied while accessing pool", e); + } + // We expect the following to succeed, because DistributedFileSystem // qualifies the path. long relativeId = addAsUnprivileged(