Browse Source

Increase max regex length in SpEL expressions

This commit increases the max regex length in SpEL expressions from 256
to 1024 in order to support use cases where a regex may be rather long
without necessarily increasing the complexity of the regex.

Closes gh-30265
pull/30308/head
Sam Brannen 3 years ago
parent
commit
310344cf61
  1. 2
      spring-expression/src/main/java/org/springframework/expression/spel/ast/OperatorMatches.java
  2. 10
      spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java

2
spring-expression/src/main/java/org/springframework/expression/spel/ast/OperatorMatches.java

@ -47,7 +47,7 @@ public class OperatorMatches extends Operator { @@ -47,7 +47,7 @@ public class OperatorMatches extends Operator {
* Maximum number of characters permitted in a regular expression.
* @since 5.2.23
*/
private static final int MAX_REGEX_LENGTH = 256;
private static final int MAX_REGEX_LENGTH = 1024;
private final ConcurrentMap<String, Pattern> patternCache;

10
spring-expression/src/test/java/org/springframework/expression/spel/EvaluationTests.java

@ -484,15 +484,13 @@ class EvaluationTests extends AbstractExpressionTests { @@ -484,15 +484,13 @@ class EvaluationTests extends AbstractExpressionTests {
@Test
void matchesWithPatternLengthThreshold() {
String pattern = "(0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
"0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" +
"01234567890123456789012345678901234567890123456789|abc)";
assertThat(pattern).hasSize(256);
Expression expr = parser.parseExpression("'abc' matches '" + pattern + "'");
String pattern = "(%s|X)".formatted("1234".repeat(255));
assertThat(pattern).hasSize(1024);
Expression expr = parser.parseExpression("'X' matches '" + pattern + "'");
assertThat(expr.getValue(context, Boolean.class)).isTrue();
pattern += "?";
assertThat(pattern).hasSize(257);
assertThat(pattern).hasSize(1025);
evaluateAndCheckError("'abc' matches '" + pattern + "'", Boolean.class, SpelMessage.MAX_REGEX_LENGTH_EXCEEDED);
}

Loading…
Cancel
Save