This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #126180] /(?[\ &!])/ segfaults
authorKarl Williamson <khw@cpan.org>
Mon, 12 Oct 2015 22:38:32 +0000 (16:38 -0600)
committerKarl Williamson <khw@cpan.org>
Tue, 13 Oct 2015 19:09:42 +0000 (13:09 -0600)
pod/perldelta.pod
regcomp.c
t/re/reg_mesg.t

index 12cf544..e0241a8 100644 (file)
@@ -394,6 +394,13 @@ There were places in regular expression patterns where comments
 (C<(?#...)>) weren't allowed, but should have been.  This is now fixed.
 [perl #116639]
 
+=item *
+
+A regression from perl v5.20 has been fixed, in which some syntax errors
+in L<C<(?[...])>|perlrecharclass/Extended Bracketed Character Classes>
+constructs within regular expression patterns could cause a segfault
+instead of a proper error message.  [perl #126180]
+
 =back
 
 =head1 Known Problems
index 0612352..e8e389a 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13884,10 +13884,16 @@ redo_curchar:
                 /* Here, the new operator has equal or lower precedence than
                  * what's already there.  This means the operation already
                  * there should be performed now, before the new one. */
+
                 rhs = av_pop(stack);
-                lhs = av_pop(stack);
+                if (! IS_OPERAND(rhs)) {
 
-                assert(IS_OPERAND(rhs));
+                    /* This can happen when a ! is not followed by an operand,
+                     * like in /(?[\t &!])/ */
+                    goto bad_syntax;
+                }
+
+                lhs = av_pop(stack);
                 assert(IS_OPERAND(lhs));
 
                 switch (stacked_operator) {
@@ -14011,6 +14017,7 @@ redo_curchar:
         || SvTYPE(final) != SVt_INVLIST
         || av_tindex(stack) >= 0)  /* More left on stack */
     {
+      bad_syntax:
         SvREFCNT_dec(final);
         vFAIL("Incomplete expression within '(?[ ])'");
     }
index 9a0424b..94a8903 100644 (file)
@@ -258,6 +258,7 @@ my @death =
  'm/\cß/' => "Character following \"\\c\" must be printable ASCII",
  '/((?# This is a comment in the middle of a token)?:foo)/' => 'In \'(?...)\', the \'(\' and \'?\' must be adjacent {#} m/((?# This is a comment in the middle of a token)?{#}:foo)/',
  '/((?# This is a comment in the middle of a token)*FAIL)/' => 'In \'(*VERB...)\', the \'(\' and \'*\' must be adjacent {#} m/((?# This is a comment in the middle of a token)*{#}FAIL)/',
+ '/(?[\ &!])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[\ &!{#}])/',    # [perl #126180]
 );
 
 # These are messages that are warnings when not strict; death under 'use re