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 b6338a7e42e..f93c2a0bad8 100644 --- a/src/java.base/share/classes/java/util/regex/Pattern.java +++ b/src/java.base/share/classes/java/util/regex/Pattern.java @@ -1427,7 +1427,11 @@ public final class Pattern localTCNCount = 0; if (!pattern.isEmpty()) { - compile(); + try { + compile(); + } catch (StackOverflowError soe) { + throw error("Stack overflow during pattern compilation"); + } } else { root = new Start(lastAccept); matchRoot = lastAccept; @@ -1965,6 +1969,10 @@ loop: for(int x=0, offset=0; x patternLength) { + cursor = patternLength; + ch = temp[cursor++]; + } return ch; } @@ -1975,6 +1983,10 @@ loop: for(int x=0, offset=0; x patternLength) { + cursor = patternLength; + ch = temp[cursor]; + } return ch; } @@ -3415,9 +3427,10 @@ loop: for(int x=0, offset=0; x patternLength) - throw error("Unclosed character name escape sequence"); + while (read() != '}') { + if (cursor >= patternLength) + throw error("Unclosed character name escape sequence"); + } String name = new String(temp, i, cursor - i - 1); try { return Character.codePointOf(name);