PATCH: [perl #133995], Assertion failure in regmatch
authorKarl Williamson <khw@cpan.org>
Wed, 10 Apr 2019 00:53:53 +0000 (18:53 -0600)
committerKarl Williamson <khw@cpan.org>
Wed, 10 Apr 2019 00:58:46 +0000 (18:58 -0600)
This was due to my forgetting that when the positive operation can only
match UTF-8 invariant characters, the complement of it can match
variants.  The only change needed is to pass the utf8ness to the macro
that does the work.

regexec.c
t/re/pat.t

index ee98c86..48ed8c3 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -2156,14 +2156,16 @@ S_find_byclass(pTHX_ regexp * prog, const regnode *c, char *s,
         break;
 
     case ANYOFM:    /* ARG() is the base byte; FLAGS() the mask byte */
-        /* UTF-8ness doesn't matter, so use 0 */
+        /* UTF-8ness doesn't matter because only matches UTF-8 invariants, so
+         * use 0 */
         REXEC_FBC_FIND_NEXT_SCAN(0,
          (char *) find_next_masked((U8 *) s, (U8 *) strend,
                                    (U8) ARG(c), FLAGS(c)));
         break;
 
-    case NANYOFM:
-        REXEC_FBC_FIND_NEXT_SCAN(0,
+    case NANYOFM:   /* UTF-8ness does matter because can match UTF-8 variants.
+                     */
+        REXEC_FBC_FIND_NEXT_SCAN(utf8_target,
          (char *) find_span_end_mask((U8 *) s, (U8 *) strend,
                                    (U8) ARG(c), FLAGS(c)));
         break;
index f309dd6..857cd38 100644 (file)
@@ -25,7 +25,7 @@ BEGIN {
 skip_all('no re module') unless defined &DynaLoader::boot_DynaLoader;
 skip_all_without_unicode_tables();
 
-plan tests => 861;  # Update this when adding/deleting tests.
+plan tests => 862;  # Update this when adding/deleting tests.
 
 run_tests() unless caller;
 
@@ -2088,6 +2088,12 @@ x{0c!}\;\;îçÿ \0\7f/0f/!\0F\ 5\0\0/;îçÿù\Q\0\ 1\0\0x\10ÿÿÿÿ\0\0\0ù\0\0\0\7f`x{0c!}\ 1;\0\0\0ù\Q
         '/[\S\s]/l works');
     }
 
+    {   # perl #133995]
+        use utf8;
+        fresh_perl_is('"έδωσαν ελληνικήვე" =~ m/[^0](?=0)0?/', "", {},
+        '[^0] doesnt crash on UTF-8 target string');
+    }
+
 } # End of sub run_tests
 
 1;