Stop duplicate lex vars from leaking under fatal warnings
authorFather Chrysostomos <sprout@cpan.org>
Fri, 30 Nov 2012 06:49:09 +0000 (22:49 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sat, 1 Dec 2012 02:02:35 +0000 (18:02 -0800)
pad.c
t/op/svleak.t

diff --git a/pad.c b/pad.c
index 0818625..dd348f7 100644 (file)
--- a/pad.c
+++ b/pad.c
@@ -627,8 +627,12 @@ Perl_pad_add_name_pvn(pTHX_ const char *namepv, STRLEN namelen,
         flags &= ~padadd_UTF8_NAME;
 
     if ((flags & padadd_NO_DUP_CHECK) == 0) {
+       ENTER;
+       SAVEFREESV(namesv); /* in case of fatal warnings */
        /* check for duplicate declaration */
        pad_check_dup(namesv, flags & padadd_OUR, ourstash);
+       SvREFCNT_inc_simple_void_NN(namesv);
+       LEAVE;
     }
 
     offset = pad_alloc_name(namesv, flags & ~padadd_UTF8_NAME, typestash, ourstash);
index dfce9f2..071a7a2 100644 (file)
@@ -93,9 +93,9 @@ eleak(2, 0, "$all *x=sub() {1}",
      'fatal const sub redef warning with sub-to-glob assignment');
 eleak(2, 0, "$all XS::APItest::newCONSTSUB(\\%main::=>name=>0=>1)",
      'newCONSTSUB sub redefinition with fatal warnings');
-$::TODO = 'still leaks';
 eleak(2, 0, "$f 'misc'; my\$a,my\$a", 'double my with fatal warnings');
 eleak(2, 0, "$f 'misc'; our\$a,our\$a", 'double our with fatal warnings');
+$::TODO = 'still leaks';
 eleak(2, 0, "$f 'closure';
              sub foo { my \$x; format=\n\@\n\$x\n.\n} write; ",
      'write beyond end of page with fatal warnings');