This is an automated email from the ASF dual-hosted git repository. markt pushed a commit to branch 8.5.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/8.5.x by this push: new aaf50d0 Ensure correct exception with ImportHandler and Java 9+ aaf50d0 is described below commit aaf50d00476b57ab4b391e4781951f872653c69e Author: Mark Thomas <ma...@apache.org> AuthorDate: Thu Oct 3 23:24:47 2019 +0100 Ensure correct exception with ImportHandler and Java 9+ --- java/javax/el/ImportHandler.java | 6 ++++-- java/javax/el/Jre9Compat.java | 29 +++++++++++++++++++++++++++-- java/javax/el/JreCompat.java | 13 +++++++++++++ java/javax/el/LocalStrings.properties | 2 +- 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/java/javax/el/ImportHandler.java b/java/javax/el/ImportHandler.java index 651e5ec..230cfaf 100644 --- a/java/javax/el/ImportHandler.java +++ b/java/javax/el/ImportHandler.java @@ -463,10 +463,12 @@ public class ImportHandler { return null; } - // Class must be public, non-abstract and not an interface + // Class must be public, non-abstract, not an interface and (for + // Java 9+) in an exported package + JreCompat jreCompat = JreCompat.getInstance(); int modifiers = clazz.getModifiers(); if (!Modifier.isPublic(modifiers) || Modifier.isAbstract(modifiers) || - Modifier.isInterface(modifiers)) { + Modifier.isInterface(modifiers) || !jreCompat.isExported(clazz)) { if (throwException) { throw new ELException(Util.message( null, "importHandler.invalidClass", name)); diff --git a/java/javax/el/Jre9Compat.java b/java/javax/el/Jre9Compat.java index 2718713..b95f93a 100644 --- a/java/javax/el/Jre9Compat.java +++ b/java/javax/el/Jre9Compat.java @@ -29,16 +29,29 @@ import java.lang.reflect.Method; class Jre9Compat extends JreCompat { private static final Method canAccessMethod; - + private static final Method getModuleMethod; + private static final Method isExportedMethod; static { Method m1 = null; + Method m2 = null; + Method m3 = null; + try { - m1 = AccessibleObject.class.getMethod("canAccess", new Class<?>[] { Object.class }); + m1 = AccessibleObject.class.getMethod("canAccess", Object.class); + m2 = Class.class.getMethod("getModule"); + Class<?> moduleClass = Class.forName("java.lang.Module"); + m3 = moduleClass.getMethod("isExported", String.class); } catch (NoSuchMethodException e) { // Expected for Java 8 + } catch (ClassNotFoundException e) { + // Can't log this so... + throw new RuntimeException(e); } + canAccessMethod = m1; + getModuleMethod = m2; + isExportedMethod = m3; } @@ -55,4 +68,16 @@ class Jre9Compat extends JreCompat { return false; } } + + + @Override + public boolean isExported(Class<?> type) { + try { + String packageName = type.getPackage().getName(); + Object module = getModuleMethod.invoke(type); + return ((Boolean) isExportedMethod.invoke(module, packageName)).booleanValue(); + } catch (ReflectiveOperationException e) { + return false; + } + } } diff --git a/java/javax/el/JreCompat.java b/java/javax/el/JreCompat.java index 6d68ed0..1b21af9 100644 --- a/java/javax/el/JreCompat.java +++ b/java/javax/el/JreCompat.java @@ -57,4 +57,17 @@ class JreCompat { // Java 8 doesn't support modules so default to true return true; } + + + /** + * Is the given class in an exported package? + * + * @param type The class to test + * + * @return Always {@code true} for Java 8. {@code true} if the enclosing + * package is exported for Java 9+ + */ + public boolean isExported(Class<?> type) { + return true; + } } diff --git a/java/javax/el/LocalStrings.properties b/java/javax/el/LocalStrings.properties index b875ab4..4bca364 100644 --- a/java/javax/el/LocalStrings.properties +++ b/java/javax/el/LocalStrings.properties @@ -29,7 +29,7 @@ expressionFactory.readFailed=Failed to read [{0}] importHandler.ambiguousImport=The class [{0}] could not be imported as it conflicts with [{1}] which has already been imported importHandler.ambiguousStaticImport=The static import [{0}] could not be processed as it conflicts with [{1}] which has already been imported importHandler.classNotFound=The class [{0}] could not be imported as it could not be found -importHandler.invalidClass=The class [{0}] must be public, non-abstract and not an interface +importHandler.invalidClass=The class [{0}] must be public, non-abstract, not an interface and (for Java 9+) in an exported package importHandler.invalidClassName=Name of class to import [{0}] must include a package importHandler.invalidClassNameForStatic=The class [{0}] specified for static import [{1}] is not valid importHandler.invalidStaticName=Name of static method or field to import [{0}] must include a class --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org