You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2021/07/28 14:38:18 UTC

[tomcat] branch main updated: Fix failing tests. JreCompat caught IAE for canAccess() so do the same

This is an automated email from the ASF dual-hosted git repository.

markt pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git


The following commit(s) were added to refs/heads/main by this push:
     new d26f48d  Fix failing tests. JreCompat caught IAE for canAccess() so do the same
d26f48d is described below

commit d26f48db6c18c786158514536b044bef4d05fa0a
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Jul 28 15:18:27 2021 +0100

    Fix failing tests. JreCompat caught IAE for canAccess() so do the same
---
 java/jakarta/el/ELProcessor.java           |  6 +++---
 java/jakarta/el/StaticFieldELResolver.java |  4 ++--
 java/jakarta/el/Util.java                  | 14 ++++++++++++--
 3 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/java/jakarta/el/ELProcessor.java b/java/jakarta/el/ELProcessor.java
index 61d8a2a..107bd23 100644
--- a/java/jakarta/el/ELProcessor.java
+++ b/java/jakarta/el/ELProcessor.java
@@ -118,7 +118,7 @@ public class ELProcessor {
             if (!Modifier.isStatic(method.getModifiers())) {
                 continue;
             }
-            if (!method.canAccess(null)) {
+            if (!Util.canAccess(null, method)) {
                 continue;
             }
             if (method.getName().equals(sig.getName())) {
@@ -191,8 +191,8 @@ public class ELProcessor {
 
         int modifiers = method.getModifiers();
 
-        // Check for static, public method and module access for Java 9+
-        if (!Modifier.isStatic(modifiers) || !method.canAccess(null)) {
+        // Check for static, public method and module access
+        if (!Modifier.isStatic(modifiers) || !Util.canAccess(null, method)) {
             throw new NoSuchMethodException(Util.message(context,
                     "elProcessor.defineFunctionInvalidMethod", method.getName(),
                     method.getDeclaringClass().getName()));
diff --git a/java/jakarta/el/StaticFieldELResolver.java b/java/jakarta/el/StaticFieldELResolver.java
index 4da5c8f..6722c7a 100644
--- a/java/jakarta/el/StaticFieldELResolver.java
+++ b/java/jakarta/el/StaticFieldELResolver.java
@@ -45,7 +45,7 @@ public class StaticFieldELResolver extends ELResolver {
                 int modifiers = field.getModifiers();
                 if (Modifier.isStatic(modifiers) &&
                         Modifier.isPublic(modifiers) &&
-                        field.canAccess(null)) {
+                        Util.canAccess(null, field)) {
                     return field.get(null);
                 }
             } catch (IllegalArgumentException | IllegalAccessException |
@@ -158,7 +158,7 @@ public class StaticFieldELResolver extends ELResolver {
                 int modifiers = field.getModifiers();
                 if (Modifier.isStatic(modifiers) &&
                         Modifier.isPublic(modifiers) &&
-                        field.canAccess(null)) {
+                        Util.canAccess(null, field)) {
                     return field.getType();
                 }
             } catch (IllegalArgumentException | NoSuchFieldException |
diff --git a/java/jakarta/el/Util.java b/java/jakarta/el/Util.java
index 3bfd267..880c1db 100644
--- a/java/jakarta/el/Util.java
+++ b/java/jakarta/el/Util.java
@@ -17,6 +17,7 @@
 package jakarta.el;
 
 import java.lang.ref.WeakReference;
+import java.lang.reflect.AccessibleObject;
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
@@ -547,7 +548,7 @@ class Util {
         // If base is non-null, method may be static or non-static
         if (m == null ||
                 (Modifier.isPublic(type.getModifiers()) &&
-                        (m.canAccess(base) || base != null && m.canAccess(null)))) {
+                        (canAccess(base, m) || base != null && canAccess(null, m)))) {
             return m;
         }
         Class<?>[] interfaces = type.getInterfaces();
@@ -602,7 +603,7 @@ class Util {
 
         Constructor<?> constructor = wrapper.unWrap();
 
-        if (!Modifier.isPublic(clazz.getModifiers()) || !constructor.canAccess(null)) {
+        if (!Modifier.isPublic(clazz.getModifiers()) || !canAccess(null, constructor)) {
             throw new MethodNotFoundException(message(
                     null, "util.method.notfound", clazz, methodName,
                     paramString(paramTypes)));
@@ -612,6 +613,15 @@ class Util {
     }
 
 
+    static boolean canAccess(Object base, AccessibleObject accessibleObject) {
+        try {
+            return accessibleObject.canAccess(base);
+        } catch (IllegalArgumentException iae) {
+            return false;
+        }
+    }
+
+
     static Object[] buildParameters(Class<?>[] parameterTypes,
             boolean isVarArgs,Object[] params) {
         ExpressionFactory factory = getExpressionFactory();

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org