Skip to content

Commit de73c2b

Browse files
TomasHofmanel-bot
authored andcommitted
CVE-2021-28170 Fix expression delimiter escaping (#160)
Co-authored-by: rmartinc [email protected]
1 parent ff8c2e6 commit de73c2b

File tree

3 files changed

+58
-5
lines changed

3 files changed

+58
-5
lines changed

impl/src/main/java/com/sun/el/parser/ELParser.jjt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -453,8 +453,8 @@ TOKEN_MGR_DECLS:
453453
< LITERAL_EXPRESSION:
454454
((~["\\", "$", "#"])
455455
| ("\\" ("\\" | "$" | "#"))
456-
| ("$" ~["{", "$", "#"])
457-
| ("#" ~["{", "$", "#"])
456+
| ("$" ~["{", "$", "#", "\\"])
457+
| ("#" ~["{", "$", "#", "\\"])
458458
)+
459459
| "$"
460460
| "#"

impl/src/main/java/com/sun/el/parser/ELParserTokenManager.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616

1717
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParserTokenManager.java */
1818
package com.sun.el.parser;
19-
import java.io.StringReader;
20-
import jakarta.el.ELException;
2119

2220
/** Token Manager. */
2321
public class ELParserTokenManager implements ELParserConstants
@@ -201,7 +199,7 @@ else if (curChar == 92)
201199
jjCheckNAddStates(0, 3);
202200
break;
203201
case 4:
204-
if ((0xf7ffffffffffffffL & l) == 0L)
202+
if ((0xf7ffffffefffffffL & l) == 0L)
205203
break;
206204
if (kind > 1)
207205
kind = 1;
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.glassfish.el.test;
2+
3+
import jakarta.el.ELManager;
4+
import jakarta.el.ELProcessor;
5+
import jakarta.el.ValueExpression;
6+
import org.junit.Assert;
7+
import org.junit.BeforeClass;
8+
import org.junit.Test;
9+
10+
import static org.junit.Assert.assertEquals;
11+
12+
public class EscapingTest {
13+
14+
static ELProcessor elp;
15+
static ELManager elm;
16+
17+
public EscapingTest() {
18+
}
19+
20+
@BeforeClass
21+
public static void setUpClass() throws Exception {
22+
elp = new ELProcessor();
23+
elm = elp.getELManager();
24+
}
25+
26+
@Test
27+
public void testEscape01() {
28+
assertEquals("$2", evaluateExpression("$${1+1}"));
29+
assertEquals("$${1+1}", evaluateExpression("$\\${1+1}"));
30+
}
31+
32+
@Test
33+
public void testEscape02() {
34+
assertEquals("$2", evaluateExpression("$#{1+1}"));
35+
assertEquals("$#{1+1}", evaluateExpression("$\\#{1+1}"));
36+
}
37+
38+
@Test
39+
public void testEscape03() {
40+
assertEquals("#2", evaluateExpression("##{1+1}"));
41+
assertEquals("##{1+1}", evaluateExpression("#\\#{1+1}"));
42+
}
43+
44+
@Test
45+
public void testEscape04() {
46+
assertEquals("#2", evaluateExpression("#${1+1}"));
47+
assertEquals("#${1+1}", evaluateExpression("#\\${1+1}"));
48+
}
49+
50+
private String evaluateExpression(String expr) {
51+
ValueExpression v = ELManager.getExpressionFactory().createValueExpression(
52+
elm.getELContext(), expr, String.class);
53+
return (String) v.getValue(elm.getELContext());
54+
}
55+
}

0 commit comments

Comments
 (0)