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/09/30 14:10:59 UTC

[tomcat] branch main updated: ElResolver.getType() must return null for read-only resolvers/properties

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 7c630a7  ElResolver.getType() must return null for read-only resolvers/properties
7c630a7 is described below

commit 7c630a7fde51c858c899f5155c21f4462d971ec2
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Thu Sep 30 15:10:45 2021 +0100

    ElResolver.getType() must return null for read-only resolvers/properties
---
 java/jakarta/el/ArrayELResolver.java          |  7 +++++++
 java/jakarta/el/BeanELResolver.java           |  8 +++++++-
 java/jakarta/el/BeanNameELResolver.java       | 11 +++++++++--
 java/jakarta/el/ListELResolver.java           |  9 +++++++++
 java/jakarta/el/MapELResolver.java            |  6 ++++++
 java/jakarta/el/ResourceBundleELResolver.java |  4 ++++
 java/jakarta/el/StaticFieldELResolver.java    | 26 ++++++++------------------
 webapps/docs/changelog.xml                    |  7 +++++++
 8 files changed, 57 insertions(+), 21 deletions(-)

diff --git a/java/jakarta/el/ArrayELResolver.java b/java/jakarta/el/ArrayELResolver.java
index 24e32d6..c9a0aff 100644
--- a/java/jakarta/el/ArrayELResolver.java
+++ b/java/jakarta/el/ArrayELResolver.java
@@ -45,6 +45,13 @@ public class ArrayELResolver extends ELResolver {
             } catch (IllegalArgumentException e) {
                 // ignore
             }
+            /*
+             * The resolver may have been created in read-only mode but the
+             * array and its elements will always be read-write.
+             */
+            if (readOnly) {
+                return null;
+            }
             return base.getClass().getComponentType();
         }
 
diff --git a/java/jakarta/el/BeanELResolver.java b/java/jakarta/el/BeanELResolver.java
index 2b6f455..81a229b 100644
--- a/java/jakarta/el/BeanELResolver.java
+++ b/java/jakarta/el/BeanELResolver.java
@@ -69,7 +69,13 @@ public class BeanELResolver extends ELResolver {
         }
 
         context.setPropertyResolved(base, property);
-        return this.property(context, base, property).getPropertyType();
+        BeanProperty beanProperty = property(context, base, property);
+
+        if (readOnly || beanProperty.isReadOnly(base)) {
+            return null;
+        }
+
+        return beanProperty.getPropertyType();
     }
 
     @Override
diff --git a/java/jakarta/el/BeanNameELResolver.java b/java/jakarta/el/BeanNameELResolver.java
index 814c6f5..ad65ccf 100644
--- a/java/jakarta/el/BeanNameELResolver.java
+++ b/java/jakarta/el/BeanNameELResolver.java
@@ -104,9 +104,16 @@ public class BeanNameELResolver extends ELResolver {
 
         try {
             if (beanNameResolver.isNameResolved(beanName)) {
-                Class<?> result = beanNameResolver.getBean(beanName).getClass();
                 context.setPropertyResolved(base, property);
-                return result;
+
+                /*
+                 * No resolver level isReadOnly property for this resolver
+                 */
+                if (beanNameResolver.isReadOnly((String) property)) {
+                    return null;
+                }
+
+                return beanNameResolver.getBean(beanName).getClass();
             }
         } catch (Throwable t) {
             Util.handleThrowable(t);
diff --git a/java/jakarta/el/ListELResolver.java b/java/jakarta/el/ListELResolver.java
index 73fcc39..de50fdf 100644
--- a/java/jakarta/el/ListELResolver.java
+++ b/java/jakarta/el/ListELResolver.java
@@ -51,6 +51,15 @@ public class ListELResolver extends ELResolver {
                 throw new PropertyNotFoundException(
                         new ArrayIndexOutOfBoundsException(idx).getMessage());
             }
+
+            /*
+             * Not perfect as a custom list implementation may be read-only but
+             * consistent with isReadOnly().
+             */
+            if (list.getClass() == UNMODIFIABLE || readOnly) {
+                return null;
+            }
+
             return Object.class;
         }
 
diff --git a/java/jakarta/el/MapELResolver.java b/java/jakarta/el/MapELResolver.java
index 6ce3422..9526830 100644
--- a/java/jakarta/el/MapELResolver.java
+++ b/java/jakarta/el/MapELResolver.java
@@ -46,6 +46,12 @@ public class MapELResolver extends ELResolver {
 
         if (base instanceof Map<?,?>) {
             context.setPropertyResolved(base, property);
+
+            Map<?, ?> map = (Map<?, ?>) base;
+            if (readOnly || map.getClass() == UNMODIFIABLE) {
+                return null;
+            }
+
             return Object.class;
         }
 
diff --git a/java/jakarta/el/ResourceBundleELResolver.java b/java/jakarta/el/ResourceBundleELResolver.java
index 9f2563a..e9d0ceb 100644
--- a/java/jakarta/el/ResourceBundleELResolver.java
+++ b/java/jakarta/el/ResourceBundleELResolver.java
@@ -57,6 +57,10 @@ public class ResourceBundleELResolver extends ELResolver {
 
         if (base instanceof ResourceBundle) {
             context.setPropertyResolved(base, property);
+            /*
+             * ResourceBundles are always read-only so fall-through to return
+             * null
+             */
         }
 
         return null;
diff --git a/java/jakarta/el/StaticFieldELResolver.java b/java/jakarta/el/StaticFieldELResolver.java
index 9083a5e..e164e9d 100644
--- a/java/jakarta/el/StaticFieldELResolver.java
+++ b/java/jakarta/el/StaticFieldELResolver.java
@@ -149,25 +149,15 @@ public class StaticFieldELResolver extends ELResolver {
 
             Class<?> clazz = ((ELClass) base).getKlass();
             String name = (String) property;
-            Exception exception = null;
             try {
-                Field field = clazz.getField(name);
-                int modifiers = field.getModifiers();
-                if (Modifier.isStatic(modifiers) &&
-                        Modifier.isPublic(modifiers) &&
-                        Util.canAccess(null, field)) {
-                    return field.getType();
-                }
-            } catch (IllegalArgumentException | NoSuchFieldException |
-                    SecurityException e) {
-                exception = e;
-            }
-            String msg = Util.message(context, "staticFieldELResolver.notFound",
-                    name, clazz.getName());
-            if (exception == null) {
-                throw new PropertyNotFoundException(msg);
-            } else {
-                throw new PropertyNotFoundException(msg, exception);
+                clazz.getField(name);
+                /*
+                 * This resolver is always read-only so fall-through to return
+                 * null.
+                 */
+            } catch (IllegalArgumentException | NoSuchFieldException | SecurityException e) {
+                String msg = Util.message(context, "staticFieldELResolver.notFound", name, clazz.getName());
+                throw new PropertyNotFoundException(msg, e);
             }
         }
         return null;
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index a31ce21..47e73b5 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -115,6 +115,13 @@
         that used variables rather than literals for both keys and values.
         (markt)
       </fix>
+      <update>
+        Ensure that the <code>getType()</code> method of any
+        <code>ELResolver</code> implementation returns <code>null</code> if
+        either the <code>ELResolver</code> or the resolved property is read-only
+        to align Tomcat with recent updates in the Jakarta EL specification
+        project. (markt)
+      </update>
     </changelog>
   </subsection>
 </section>

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