PATCH: [perl #133999] Assertion failure in regex match
authorKarl Williamson <khw@cpan.org>
Wed, 10 Apr 2019 02:22:34 +0000 (20:22 -0600)
committerKarl Williamson <khw@cpan.org>
Wed, 10 Apr 2019 02:26:25 +0000 (20:26 -0600)
This was caused by failing to limit matching to within the bounds of the
target string.  I'm pretty sure this bug has long been there, but was
exposed by the recently added wildcard property matching feature.

regexec.c
t/re/pat_advanced.t

index 48ed8c3..bd6e4b9 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -1972,9 +1972,12 @@ STMT_START {
     }
 
 /* This is the macro to use when we want to see if something that looks like it
- * could match, actually does, and if so exits the loop */
-#define REXEC_FBC_TRYIT                            \
-    if ((reginfo->intuit || regtry(reginfo, &s)))  \
+ * could match, actually does, and if so exits the loop.  It needs to be used
+ * only for bounds checking macros, as it allows for matching beyond the end of
+ * string (which should be zero length without having to look at the string
+ * contents) */
+#define REXEC_FBC_TRYIT                                                     \
+    if ((reginfo->intuit || (s <= reginfo->strend && regtry(reginfo, &s)))) \
         goto got_it
 
 /* The only difference between the BOUND and NBOUND cases is that
index 98a8994..1808d35 100644 (file)
@@ -2505,6 +2505,13 @@ EOF
         ok(! $?, "User-defined pattern did not cause panic [perl 130010]");
     }
 
+    {   # [perl #133999]    Previously assertion failure
+       fresh_perl_like('0 =~ /\p{nv:(\B(*COMMIT)C+)}/',
+                        qr/No Unicode property value wildcard matches/,
+                        {},
+                        "Assertion failure with *COMMIT and wildcard property");
+    }
+
 
     # !!! NOTE that tests that aren't at all likely to crash perl should go
     # a ways above, above these last ones.  There's a comment there that, like