8228352: CANON_EQ breaks when pattern contains supplementary codepoint
authorigerasim
Thu, 01 Aug 2019 07:14:03 -0700
changeset 57624 67e58672c503
parent 57623 bfcd6fb23509
child 57625 29dfefad1d99
8228352: CANON_EQ breaks when pattern contains supplementary codepoint Reviewed-by: naoto
src/java.base/share/classes/java/util/regex/Pattern.java
test/jdk/java/util/regex/RegExTest.java
--- a/src/java.base/share/classes/java/util/regex/Pattern.java	Thu Aug 01 16:07:07 2019 -0400
+++ b/src/java.base/share/classes/java/util/regex/Pattern.java	Thu Aug 01 07:14:03 2019 -0700
@@ -1506,7 +1506,7 @@
             String seq = src.substring(off, j);
             String nfd = Normalizer.normalize(seq, Normalizer.Form.NFD);
             off = j;
-            if (nfd.length() > 1) {
+            if (nfd.codePointCount(0, nfd.length()) > 1) {
                 ch0 = nfd.codePointAt(0);
                 ch1 = nfd.codePointAt(Character.charCount(ch0));
                 if (Character.getType(ch1) == Character.NON_SPACING_MARK) {
--- a/test/jdk/java/util/regex/RegExTest.java	Thu Aug 01 16:07:07 2019 -0400
+++ b/test/jdk/java/util/regex/RegExTest.java	Thu Aug 01 07:14:03 2019 -0700
@@ -35,7 +35,7 @@
  * 8027645 8035076 8039124 8035975 8074678 6854417 8143854 8147531 7071819
  * 8151481 4867170 7080302 6728861 6995635 6736245 4916384 6328855 6192895
  * 6345469 6988218 6693451 7006761 8140212 8143282 8158482 8176029 8184706
- * 8194667 8197462 8184692 8221431 8224789
+ * 8194667 8197462 8184692 8221431 8224789 8228352
  *
  * @library /test/lib
  * @library /lib/testlibrary/java/lang
@@ -185,6 +185,7 @@
         expoBacktracking();
         invalidGroupName();
         illegalRepetitionRange();
+        surrogatePairWithCanonEq();
 
         if (failure) {
             throw new
@@ -4973,4 +4974,14 @@
         }
         report("illegalRepetitionRange");
     }
+
+    private static void surrogatePairWithCanonEq() {
+        try {
+            Pattern.compile("\ud834\udd21", Pattern.CANON_EQ);
+        } catch (Throwable t) {
+            failCount++;
+            System.out.println("Unexpected exception: " + t);
+        }
+        report("surrogatePairWithCanonEq");
+    }
 }