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 f5937ad104b..f5d4c965b25 100644 --- a/src/java.base/share/classes/java/util/regex/Pattern.java +++ b/src/java.base/share/classes/java/util/regex/Pattern.java @@ -5060,14 +5060,14 @@ loop: for(int x=0, offset=0; x matcher.to) { + if (i + groupSizeChars > matcher.to) { matcher.hitEnd = true; return false; } @@ -5075,7 +5075,13 @@ loop: for(int x=0, offset=0; x= Character.MIN_SUPPLEMENTARY_CODE_POINT) { + //Group size is guessed in terms of chars, but we need to + //adjust if we spot a 2-char codePoint. + groupCodepoints--; + } } - return next.match(matcher, i+groupSize, seq); + return next.match(matcher, i+groupSizeChars, seq); } boolean study(TreeInfo info) { info.maxValid = false; diff --git a/test/jdk/java/util/regex/RegExTest.java b/test/jdk/java/util/regex/RegExTest.java index f46ce327f03..0a7705c800e 100644 --- a/test/jdk/java/util/regex/RegExTest.java +++ b/test/jdk/java/util/regex/RegExTest.java @@ -4556,4 +4556,13 @@ public class RegExTest { Pattern.compile(pattern)); assertTrue(e.getMessage().contains("Bad intersection syntax")); } + + //This test is for 8281315 + @Test + public static void iOOBForCIBackrefs(){ + String line = "\ud83d\udc95\ud83d\udc95\ud83d\udc95"; + var pattern2 = Pattern.compile("(?i)(.)\\1{2,}"); + assertTrue(pattern2.matcher(line).find()); + + } }