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 07:05:48 UTC

[tomcat] 02/02: Fix parsing bug for literal Maps constructed using variables.

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

commit 0790ba18a513e220de080b5b63555540cc973ff2
Author: Mark Thomas <ma...@apache.org>
AuthorDate: Wed Sep 29 22:30:07 2021 +0100

    Fix parsing bug for literal Maps constructed using variables.
---
 java/org/apache/el/parser/ELParser.java       | 164 +++++++++++++++++++++++---
 java/org/apache/el/parser/ELParser.jjt        |   2 +-
 test/org/apache/el/parser/TestAstMapData.java |  15 +++
 webapps/docs/changelog.xml                    |   5 +
 4 files changed, 166 insertions(+), 20 deletions(-)

diff --git a/java/org/apache/el/parser/ELParser.java b/java/org/apache/el/parser/ELParser.java
index 8035c82..7a50b6b 100644
--- a/java/org/apache/el/parser/ELParser.java
+++ b/java/org/apache/el/parser/ELParser.java
@@ -1783,7 +1783,7 @@ if (jjtc000) {
             }
           default:
             jj_la1[40] = jj_gen;
-            if (jj_2_8(3)) {
+            if (jj_2_8(5)) {
               SetData();
             } else {
               switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
@@ -2373,6 +2373,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Equality_182_5_40()) {
+        return true;
+    }
     return false;
   }
 
@@ -2397,11 +2400,28 @@ if (jjtc000) {
     return false;
   }
 
+  private boolean jj_3R_ListData_350_26_109()
+ {
+    if (jj_scan_token(COMMA)) {
+        return true;
+    }
+    if (jj_3R_Expression_99_5_36()) {
+        return true;
+    }
+    return false;
+  }
+
   private boolean jj_3R_MapEntry_368_5_107()
  {
     if (jj_3R_Expression_99_5_36()) {
         return true;
     }
+    if (jj_scan_token(COLON)) {
+        return true;
+    }
+    if (jj_3R_Expression_99_5_36()) {
+        return true;
+    }
     return false;
   }
 
@@ -2442,6 +2462,9 @@ if (jjtc000) {
     if (jj_scan_token(COMMA)) {
         return true;
     }
+    if (jj_3R_Expression_99_5_36()) {
+        return true;
+    }
     return false;
   }
 
@@ -2455,6 +2478,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_And_173_5_34()) {
+        return true;
+    }
     return false;
   }
 
@@ -2479,6 +2505,11 @@ if (jjtc000) {
     if (jj_3R_Expression_99_5_36()) {
         return true;
     }
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_ListData_350_26_109()) { jj_scanpos = xsp; break; }
+    }
     return false;
   }
 
@@ -2572,6 +2603,14 @@ if (jjtc000) {
     return false;
   }
 
+  private boolean jj_3R_MethodParameters_317_31_111()
+ {
+    if (jj_scan_token(COMMA)) {
+        return true;
+    }
+    return false;
+  }
+
   private boolean jj_3R_SetData_342_5_25()
  {
     if (jj_scan_token(START_SET_OR_MAP)) {
@@ -2712,12 +2751,28 @@ if (jjtc000) {
     if (jj_3R_Expression_99_5_36()) {
         return true;
     }
+    if (jj_scan_token(RPAREN)) {
+        return true;
+    }
     return false;
   }
 
-  private boolean jj_3_6()
+  private boolean jj_3R_MethodParameters_317_16_110()
  {
-    if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) {
+    if (jj_3R_Expression_99_5_36()) {
+        return true;
+    }
+    Token xsp;
+    while (true) {
+      xsp = jj_scanpos;
+      if (jj_3R_MethodParameters_317_31_111()) { jj_scanpos = xsp; break; }
+    }
+    return false;
+  }
+
+  private boolean jj_3R_ValueSuffix_291_41_108()
+ {
+    if (jj_3R_MethodParameters_317_5_106()) {
         return true;
     }
     return false;
@@ -2751,6 +2806,14 @@ if (jjtc000) {
     return false;
   }
 
+  private boolean jj_3_6()
+ {
+    if (jj_3R_LambdaExpressionOrInvocation_141_5_23()) {
+        return true;
+    }
+    return false;
+  }
+
   private boolean jj_3R_LambdaParameters_132_5_32()
  {
     if (jj_3R_Identifier_377_5_38()) {
@@ -2788,6 +2851,14 @@ if (jjtc000) {
     if (jj_scan_token(LPAREN)) {
         return true;
     }
+    Token xsp;
+    xsp = jj_scanpos;
+    if (jj_3R_MethodParameters_317_16_110()) {
+        jj_scanpos = xsp;
+    }
+    if (jj_scan_token(RPAREN)) {
+        return true;
+    }
     return false;
   }
 
@@ -2815,6 +2886,9 @@ if (jjtc000) {
     if (jj_scan_token(SEMICOLON)) {
         return true;
     }
+    if (jj_3R_Assignment_115_5_20()) {
+        return true;
+    }
     return false;
   }
 
@@ -2823,6 +2897,20 @@ if (jjtc000) {
     if (jj_scan_token(LBRACK)) {
         return true;
     }
+    if (jj_3R_Expression_99_5_36()) {
+        return true;
+    }
+    if (jj_scan_token(RBRACK)) {
+        return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_ValueSuffix_291_21_79()
+ {
+    if (jj_3R_BracketSuffix_309_5_91()) {
+        return true;
+    }
     return false;
   }
 
@@ -2839,14 +2927,6 @@ if (jjtc000) {
     return false;
   }
 
-  private boolean jj_3R_ValueSuffix_291_21_79()
- {
-    if (jj_3R_BracketSuffix_309_5_91()) {
-        return true;
-    }
-    return false;
-  }
-
   private boolean jj_3_2()
  {
     if (jj_3R_LambdaExpression_124_5_21()) {
@@ -2873,6 +2953,9 @@ if (jjtc000) {
     if (jj_scan_token(DOT)) {
         return true;
     }
+    if (jj_scan_token(IDENTIFIER)) {
+        return true;
+    }
     return false;
   }
 
@@ -2907,6 +2990,10 @@ if (jjtc000) {
         return true;
     }
     }
+    xsp = jj_scanpos;
+    if (jj_3R_ValueSuffix_291_41_108()) {
+        jj_scanpos = xsp;
+    }
     return false;
   }
 
@@ -3059,6 +3146,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Unary_257_9_59()) {
+        return true;
+    }
     return false;
   }
 
@@ -3080,6 +3170,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Unary_257_9_59()) {
+        return true;
+    }
     return false;
   }
 
@@ -3104,6 +3197,9 @@ if (jjtc000) {
     if (jj_scan_token(MULT)) {
         return true;
     }
+    if (jj_3R_Unary_257_9_59()) {
+        return true;
+    }
     return false;
   }
 
@@ -3133,6 +3229,9 @@ if (jjtc000) {
     if (jj_scan_token(MINUS)) {
         return true;
     }
+    if (jj_3R_Multiplication_241_5_57()) {
+        return true;
+    }
     return false;
   }
 
@@ -3162,6 +3261,9 @@ if (jjtc000) {
     if (jj_scan_token(PLUS)) {
         return true;
     }
+    if (jj_3R_Multiplication_241_5_57()) {
+        return true;
+    }
     return false;
   }
 
@@ -3220,6 +3322,9 @@ if (jjtc000) {
     if (jj_scan_token(CONCAT)) {
         return true;
     }
+    if (jj_3R_Math_227_5_51()) {
+        return true;
+    }
     return false;
   }
 
@@ -3244,6 +3349,17 @@ if (jjtc000) {
     if (jj_scan_token(COLON)) {
         return true;
     }
+    if (jj_scan_token(IDENTIFIER)) {
+        return true;
+    }
+    return false;
+  }
+
+  private boolean jj_3R_Literal_408_5_80()
+ {
+    if (jj_3R_Boolean_421_5_92()) {
+        return true;
+    }
     return false;
   }
 
@@ -3269,14 +3385,6 @@ if (jjtc000) {
     return false;
   }
 
-  private boolean jj_3R_Literal_408_5_80()
- {
-    if (jj_3R_Boolean_421_5_92()) {
-        return true;
-    }
-    return false;
-  }
-
   private boolean jj_3R_Concatenation_215_6_47()
  {
     if (jj_3R_Math_227_5_51()) {
@@ -3308,6 +3416,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Concatenation_215_6_47()) {
+        return true;
+    }
     return false;
   }
 
@@ -3321,6 +3432,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Concatenation_215_6_47()) {
+        return true;
+    }
     return false;
   }
 
@@ -3334,6 +3448,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Concatenation_215_6_47()) {
+        return true;
+    }
     return false;
   }
 
@@ -3366,6 +3483,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Concatenation_215_6_47()) {
+        return true;
+    }
     return false;
   }
 
@@ -3412,6 +3532,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Compare_196_5_44()) {
+        return true;
+    }
     return false;
   }
 
@@ -3438,6 +3561,9 @@ if (jjtc000) {
         return true;
     }
     }
+    if (jj_3R_Compare_196_5_44()) {
+        return true;
+    }
     return false;
   }
 
diff --git a/java/org/apache/el/parser/ELParser.jjt b/java/org/apache/el/parser/ELParser.jjt
index d519d2b..ce9c7fe 100644
--- a/java/org/apache/el/parser/ELParser.jjt
+++ b/java/org/apache/el/parser/ELParser.jjt
@@ -327,7 +327,7 @@ void NonLiteral() : {}
     | <LPAREN> Expression() <RPAREN>
     | LOOKAHEAD((<IDENTIFIER> <COLON>)? <IDENTIFIER> <LPAREN>) Function()
     | Identifier()
-    | LOOKAHEAD(3)SetData()
+    | LOOKAHEAD(5)SetData()
     | ListData()
     | MapData()
 }
diff --git a/test/org/apache/el/parser/TestAstMapData.java b/test/org/apache/el/parser/TestAstMapData.java
index 06b5503..f84ca2c 100644
--- a/test/org/apache/el/parser/TestAstMapData.java
+++ b/test/org/apache/el/parser/TestAstMapData.java
@@ -87,4 +87,19 @@ public class TestAstMapData {
         Assert.assertEquals(Map.class, ve.getType(context));
         Assert.assertEquals(simpleMap, ve.getValue(context));
     }
+
+
+    @Test
+    public void testLiteralWithVariable() {
+        ELProcessor elp = new ELProcessor();
+
+        String key = "myKey";
+        String value = "myValue";
+        elp.setVariable("aaa", "'" + key + "'");
+        elp.setVariable("bbb", "'" + value + "'");
+
+        Object result = elp.eval("{ aaa : bbb }.get(aaa)");
+
+        Assert.assertEquals(value, result);
+    }
 }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 8f79c3e..a31ce21 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -110,6 +110,11 @@
       <update>
         Regenerate the EL parser using JavaCC 7.0.10. (markt)
       </update>
+      <fix>
+        Fix a bug that prevented the EL parser correctly parsing a literal Map
+        that used variables rather than literals for both keys and values.
+        (markt)
+      </fix>
     </changelog>
   </subsection>
 </section>

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