diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index e4cc8e7f0c4..7fc29a6930a 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -447,6 +447,9 @@ Release 2.7.0 - UNRELEASED HADOOP-11311. Restrict uppercase key names from being created with JCEKS. (wang) + HADOOP-11309. System class pattern package.Foo should match + package.Foo$Bar, too (Gera Shegalov via jlowe) + Release 2.6.0 - 2014-11-18 INCOMPATIBLE CHANGES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ApplicationClassLoader.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ApplicationClassLoader.java index b18997c9d95..d2ab015567d 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ApplicationClassLoader.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/ApplicationClassLoader.java @@ -228,10 +228,13 @@ public class ApplicationClassLoader extends URLClassLoader { c = c.substring(1); result = false; } - if (c.endsWith(".") && canonicalName.startsWith(c)) { - return result; - } else if (canonicalName.equals(c)) { - return result; + if (canonicalName.startsWith(c)) { + if ( c.endsWith(".") // package + || canonicalName.length() == c.length() // class + || canonicalName.length() > c.length() // nested + && canonicalName.charAt(c.length()) == '$' ) { + return result; + } } } } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestApplicationClassLoader.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestApplicationClassLoader.java index 5d0e131bd6c..cc16493758e 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestApplicationClassLoader.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/util/TestApplicationClassLoader.java @@ -90,15 +90,27 @@ public class TestApplicationClassLoader { @Test public void testIsSystemClass() { - assertFalse(isSystemClass("org.example.Foo", null)); - assertTrue(isSystemClass("org.example.Foo", classes("org.example.Foo"))); - assertTrue(isSystemClass("/org.example.Foo", classes("org.example.Foo"))); - assertTrue(isSystemClass("org.example.Foo", classes("org.example."))); - assertTrue(isSystemClass("net.example.Foo", + testIsSystemClassInternal(""); + } + + @Test + public void testIsSystemNestedClass() { + testIsSystemClassInternal("$Klass"); + } + + private void testIsSystemClassInternal(String nestedClass) { + assertFalse(isSystemClass("org.example.Foo" + nestedClass, null)); + assertTrue(isSystemClass("org.example.Foo" + nestedClass, + classes("org.example.Foo"))); + assertTrue(isSystemClass("/org.example.Foo" + nestedClass, + classes("org.example.Foo"))); + assertTrue(isSystemClass("org.example.Foo" + nestedClass, + classes("org.example."))); + assertTrue(isSystemClass("net.example.Foo" + nestedClass, classes("org.example.,net.example."))); - assertFalse(isSystemClass("org.example.Foo", + assertFalse(isSystemClass("org.example.Foo" + nestedClass, classes("-org.example.Foo,org.example."))); - assertTrue(isSystemClass("org.example.Bar", + assertTrue(isSystemClass("org.example.Bar" + nestedClass, classes("-org.example.Foo.,org.example."))); }