HADOOP-13519. Make Path Serializable. Contributed by Steve Loughran
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/1192781a Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/1192781a Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/1192781a Branch: refs/heads/HADOOP-12756 Commit: 1192781a78e7fcfcbf01b15de5d5a1f22d982e0d Parents: b6d839a Author: Chris Douglas <cdoug...@apache.org> Authored: Thu Sep 8 17:46:12 2016 -0700 Committer: Chris Douglas <cdoug...@apache.org> Committed: Thu Sep 8 17:46:12 2016 -0700 ---------------------------------------------------------------------- .../main/java/org/apache/hadoop/fs/Path.java | 20 +++++++++++++++++++- .../java/org/apache/hadoop/fs/TestPath.java | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/1192781a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Path.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Path.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Path.java index f18a675..252b3cc 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Path.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/Path.java @@ -19,6 +19,9 @@ package org.apache.hadoop.fs; import java.io.IOException; +import java.io.InvalidObjectException; +import java.io.ObjectInputValidation; +import java.io.Serializable; import java.net.URI; import java.net.URISyntaxException; import java.util.regex.Pattern; @@ -37,7 +40,7 @@ import org.apache.hadoop.conf.Configuration; @Stringable @InterfaceAudience.Public @InterfaceStability.Stable -public class Path implements Comparable { +public class Path implements Comparable, Serializable, ObjectInputValidation { /** * The directory separator, a slash. @@ -66,6 +69,8 @@ public class Path implements Comparable { private static final Pattern HAS_DRIVE_LETTER_SPECIFIER = Pattern.compile("^/?[a-zA-Z]:"); + private static final long serialVersionUID = 0xad00f; + private URI uri; // a hierarchical uri /** @@ -565,4 +570,17 @@ public class Path implements Comparable { } return new Path(newUri); } + + /** + * Validate the contents of a deserialized Path, so as + * to defend against malicious object streams. + * @throws InvalidObjectException if there's no URI + */ + @Override + public void validateObject() throws InvalidObjectException { + if (uri == null) { + throw new InvalidObjectException("No URI in deserialized Path"); + } + + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/1192781a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestPath.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestPath.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestPath.java index dc48a10..5123526 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestPath.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestPath.java @@ -17,9 +17,14 @@ */ package org.apache.hadoop.fs; +import org.junit.Assert; import org.junit.Test; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.net.URI; import java.net.URISyntaxException; import java.util.Arrays; @@ -506,4 +511,19 @@ public class TestPath { assertFalse(Path.isWindowsAbsolutePath("C:test", false)); assertFalse(Path.isWindowsAbsolutePath("/C:test", true)); } + + @Test(timeout = 30000) + public void testSerDeser() throws Throwable { + Path source = new Path("hdfs://localhost:4040/scratch"); + ByteArrayOutputStream baos = new ByteArrayOutputStream(256); + try(ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(source); + } + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + try (ObjectInputStream ois = new ObjectInputStream(bais)) { + Path deser = (Path) ois.readObject(); + Assert.assertEquals(source, deser); + } + + } } --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org