This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #126615] Segfault/assert fail with regex_sets
authorKarl Williamson <khw@cpan.org>
Sat, 14 Nov 2015 18:41:30 +0000 (11:41 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 14 Nov 2015 18:56:49 +0000 (11:56 -0700)
This is a the result of where I added an assert to make sure that
where I didn't think a situation could happen, in fact couldn't.  But it
turns out it can happen when there is a syntax error, so raise an error,
instead of doing the assert.

regcomp.c
t/re/reg_mesg.t

index a37dc82..da6eb16 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -13899,7 +13899,13 @@ redo_curchar:
                 }
 
                 lhs = av_pop(stack);
-                assert(IS_OPERAND(lhs));
+
+                if (! IS_OPERAND(lhs)) {
+
+                    /* This can happen when there is an empty (), like in
+                     * /(?[[0]+()+])/ */
+                    goto bad_syntax;
+                }
 
                 switch (stacked_operator) {
                     case '&':
index 9e5a406..62e3e4a 100644 (file)
@@ -219,6 +219,8 @@ my @death =
  '/(?[ \cK + ) ])/' => 'Unexpected \')\' {#} m/(?[ \cK + ){#} ])/',
  '/(?[ \cK + ])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[ \cK + {#}])/',
  '/(?[ ( ) ])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[ ( ) {#}])/',
+ '/(?[ ( ) ])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[ ( ) {#}])/',
+ '/(?[[0]+()+])/' => 'Incomplete expression within \'(?[ ])\' {#} m/(?[[0]+()+{#}])/',
  '/(?[ \p{foo} ])/' => 'Can\'t find Unicode property definition "foo" {#} m/(?[ \p{foo}{#} ])/',
  '/(?[ \p{ foo = bar } ])/' => 'Can\'t find Unicode property definition "foo = bar" {#} m/(?[ \p{ foo = bar }{#} ])/',
  '/(?[ \8 ])/' => 'Unrecognized escape \8 in character class {#} m/(?[ \8{#} ])/',