This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #133767] Assertion failure
authorKarl Williamson <khw@cpan.org>
Sat, 16 Feb 2019 16:50:33 +0000 (09:50 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 16 Feb 2019 17:08:23 +0000 (10:08 -0700)
The problem here is that a syntax error occurs and hence certain things
don't get done, but processing continues, as the error isn't checked for
until after the return of the function that found it.  The failing
assertion is checking that those certain things actually did get done.

There appear to be good reasons to defer the raising of the error until
then, so the simplest way to fix this is to generalize the code so that
the failing assertion doesn't happen.

pod/perldelta.pod
regcomp.c
t/re/reg_mesg.t

index 74c9bdf..75bf63e 100644 (file)
@@ -382,6 +382,11 @@ the same property as another simultaneously.  These have now been fixed.
 
 =back
 
+=item * Assertion failure in compiling invalid regex pattern [perl #133767]
+
+This bug was introduced in the 5.29 series, so this should not be in the
+perldelta for 5.30.
+
 =back
 
 =head1 Acknowledgements
index 088b1df..387126e 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -18178,8 +18178,13 @@ S_regclass(pTHX_ RExC_state_t *pRExC_state, I32 *flagp, U32 depth,
              * the only element in the character class (perluniprops.pod notes
              * such properties). */
             if (partial_cp_count == 0) {
-                assert (! invert);
-                ret = reganode(pRExC_state, OPFAIL, 0);
+                if (invert) {
+                    ret = reg_node(pRExC_state, SANY);
+                }
+                else {
+                    ret = reganode(pRExC_state, OPFAIL, 0);
+                }
+
                 goto not_anyof;
             }
 
index 13a37b5..5d88fe7 100644 (file)
@@ -313,6 +313,7 @@ my @death =
  '/(?<=/' => 'Sequence (?... not terminated {#} m/(?<={#}/',                        # [perl #128170]
  '/\p{vertical \v tab}/' => 'Can\'t find Unicode property definition "vertical \v tab" {#} m/\\p{vertical \v tab}{#}/', # [perl #132055]
  "/$bug133423/" => "Operand with no preceding operator {#} m/(?[(?^:(?[\\\0]))\\{#}]\0|2[^^]\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80])R.\\670/",
+ '/[^/' => 'Unmatched [ {#} m/[{#}^/', # [perl #133767]
 
 );