From f5e2916507ffe8de8a3ae70bc886988d1190d1ff Mon Sep 17 00:00:00 2001 From: Ivan Gerasimov Date: Wed, 29 May 2019 13:44:27 -0700 Subject: [PATCH] 8224789: Parsing repetition count in regex does not detect numeric overflow Reviewed-by: rriggs, bchristi --- .../classes/java/util/regex/Pattern.java | 37 ++++++------ test/jdk/java/util/regex/RegExTest.java | 57 ++++++++++++++++--- 2 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/java.base/share/classes/java/util/regex/Pattern.java b/src/java.base/share/classes/java/util/regex/Pattern.java index 86192cf8442..a1541bd4434 100644 --- a/src/java.base/share/classes/java/util/regex/Pattern.java +++ b/src/java.base/share/classes/java/util/regex/Pattern.java @@ -3271,28 +3271,33 @@ loop: for(int x=0, offset=0; x (2^31 - 1) + String n = BigInteger.valueOf(1L << 32) + .toString(); + String m = BigInteger.valueOf(1L << 31) + .add(new BigInteger(80, generator)) + .toString(); + for (String rep : List.of("", "x", ".", ",", "-1", "2,1", + n, n + ",", "0," + n, n + "," + m, m, m + ",", "0," + m)) { + String pat = ".{" + rep + "}"; + try { + Pattern.compile(pat); + failCount++; + System.out.println("Expected to fail. Pattern: " + pat); + } catch (PatternSyntaxException e) { + if (!e.getMessage().startsWith("Illegal repetition")) { + failCount++; + System.out.println("Unexpected error message: " + e.getMessage()); + } + } catch (Throwable t) { + failCount++; + System.out.println("Unexpected exception: " + t); + } + } + report("illegalRepetitionRange"); + } }