diff --git a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java index f8b07ab219dd..46528ff7853f 100644 --- a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java +++ b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestRootedOzoneFileSystem.java @@ -24,6 +24,7 @@ import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.InvalidPathException; import org.apache.hadoop.fs.Path; import org.apache.hadoop.fs.PathIsNotEmptyDirectoryException; import org.apache.hadoop.fs.Trash; @@ -47,6 +48,7 @@ import org.apache.hadoop.ozone.security.acl.OzoneAclConfig; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.test.GenericTestUtils; +import org.apache.hadoop.test.LambdaTestUtils; import org.junit.AfterClass; import org.junit.Assert; import org.junit.BeforeClass; @@ -1210,4 +1212,25 @@ public void testTrash() throws Exception { ofs.delete(trashRoot, true); } + + @Test + public void testCreateWithInvalidPaths() throws Exception { + // Test for path with .. + Path parent = new Path("../../../../../d1/d2/"); + Path file1 = new Path(parent, "key1"); + checkInvalidPath(file1); + + // Test for path with : + file1 = new Path("/:/:"); + checkInvalidPath(file1); + + // Test for path with scheme and authority. + file1 = new Path(fs.getUri() + "/:/:"); + checkInvalidPath(file1); + } + + private void checkInvalidPath(Path path) throws Exception { + LambdaTestUtils.intercept(InvalidPathException.class, "Invalid path Name", + () -> fs.create(path, false)); + } } diff --git a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicOzoneFileSystem.java b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicOzoneFileSystem.java index f6dedc8d8627..f6d2ef591b90 100644 --- a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicOzoneFileSystem.java +++ b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicOzoneFileSystem.java @@ -814,10 +814,8 @@ public String pathToKey(Path path) { // removing leading '/' char String key = path.toUri().getPath(); - if (OzoneFSUtils.isValidName(key)) { - key = path.toUri().getPath(); - } else { - throw new InvalidPathException("Invalid path Name" + key); + if (!OzoneFSUtils.isValidName(key)) { + throw new InvalidPathException("Invalid path Name " + key); } LOG.trace("path for key:{} is:{}", key, path); return key.substring(1); diff --git a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java index c8d6139c03f4..c035abbb493e 100644 --- a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java +++ b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneFileSystem.java @@ -26,6 +26,7 @@ import org.apache.hadoop.fs.FileChecksum; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.InvalidPathException; import org.apache.hadoop.fs.LocatedFileStatus; import org.apache.hadoop.fs.Options; import org.apache.hadoop.fs.Path; @@ -41,6 +42,7 @@ import org.apache.hadoop.ozone.client.OzoneBucket; import org.apache.hadoop.ozone.client.OzoneVolume; import org.apache.hadoop.ozone.om.exceptions.OMException; +import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.security.token.Token; import org.apache.hadoop.util.Progressable; @@ -840,8 +842,12 @@ public String pathToKey(Path path) { if (!path.isAbsolute()) { path = new Path(workingDir, path); } + String key = path.toUri().getPath(); + if (!OzoneFSUtils.isValidName(key)) { + throw new InvalidPathException("Invalid path Name " + key); + } // removing leading '/' char - String key = path.toUri().getPath().substring(1); + key = key.substring(1); LOG.trace("path for key: {} is: {}", key, path); return key; }