This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Don’t leak the /(?[])/ parsing stack on error
authorFather Chrysostomos <sprout@cpan.org>
Thu, 6 Jun 2013 04:40:24 +0000 (21:40 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 6 Jun 2013 04:40:24 +0000 (21:40 -0700)
Instead of creating the parsing stack and then freeing it after pars-
ing the (?[...]) construct (leaking it whenever one of the various
errors scattered throughout the parsing code occurs), mortalise it to
begin with and let the mortals stack take care of it.

regcomp.c
t/op/svleak.t

index 6bd7efd..d1ffe5d 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -11776,7 +11776,7 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist, I32 *f
      * been parsed and evaluated to a single operand (or else is a syntax
      * error), and is handled as a regular operand */
 
-    stack = newAV();
+    sv_2mortal((SV *)(stack = newAV()));
 
     while (RExC_parse < RExC_end) {
         I32 top_index = av_tindex(stack);
@@ -12096,7 +12096,6 @@ S_handle_regex_sets(pTHX_ RExC_state_t *pRExC_state, SV** return_invlist, I32 *f
     RExC_end = save_end;
     SvREFCNT_dec_NN(final);
     SvREFCNT_dec_NN(result_string);
-    SvREFCNT_dec_NN(stack);
 
     nextchar(pRExC_state);
     Set_Node_Length(node, RExC_parse - oregcomp_parse + 1); /* MJD */
index 642b81d..8140ded 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 
 use Config;
 
-plan tests => 114;
+plan tests => 115;
 
 # run some code N times. If the number of SVs at the end of loop N is
 # greater than (N-1)*delta at the end of loop 1, we've got a leak
@@ -240,6 +240,7 @@ eleak(2,0,'/[pp]/');
 eleak(2,0,'/[[:ascii:]]/');
 eleak(2,0,'/[[.zog.]]/');
 eleak(2,0,'/[.zog.]/');
+eleak(2,0,'no warnings; /(?[])/');
 
 # These can generate one ref count, but just  once.
 eleak(4,1,'chr(0x100) =~ /[[:punct:]]/');