This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Stop string eval from leaking ops
authorFather Chrysostomos <sprout@cpan.org>
Fri, 2 Nov 2012 19:35:25 +0000 (12:35 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 2 Nov 2012 19:35:25 +0000 (12:35 -0700)
This was leaking:

$ ./miniperl  -Xe 'warn $$; while(1){eval "ok 8"};'
1915 at -e line 1.
^C

This was not:

$ ./miniperl  -Xe 'warn $$; while(1){eval "sub {ok 8}"};'
1916 at -e line 1.
^C

The sub is successfully taking care of its ops when it is freed.  The
eval is not.

I made the mistake of having the CV relinquish ownership of the op
slab after an eval syntax error.  That’s precisely the situation in
which the ops are likely to leak, and for which the slab allocator was
designed.  Duh.

pp_ctl.c
t/op/svleak.t

index 869907d..27113c0 100644 (file)
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -3462,7 +3462,6 @@ S_doeval(pTHX_ int gimme, CV* outside, U32 seq, HV *hh)
        PL_op = saveop;
        if (yystatus != 3) {
            if (PL_eval_root) {
-               cv_forget_slab(evalcv);
                op_free(PL_eval_root);
                PL_eval_root = NULL;
            }
index 3e70598..db575b9 100644 (file)
@@ -15,7 +15,7 @@ BEGIN {
 
 use Config;
 
-plan tests => 45;
+plan tests => 46;
 
 # 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
@@ -173,7 +173,7 @@ SKIP: {
 }
 
 SKIP: {
-    skip "disabled under -Dmad (eval leaks)", 5 if $Config{mad};
+    skip "disabled under -Dmad (eval leaks)", 6 if $Config{mad};
     leak(2, 0, sub { eval '"${<<END}"
                  ' }, 'unterminated here-doc in quotes in multiline eval');
     leak(2, 0, sub { eval '"${<<END
@@ -182,6 +182,8 @@ SKIP: {
         'unterminated here-doc in file');
     leak(2, 0, sub { eval 'tr/9-0//' }, 'tr/9-0//');
     leak(2, 0, sub { eval 'tr/a-z-0//' }, 'tr/a-z-0//');
+    leak(2, 0, sub { eval 'no warnings; nonexistent_function 33838' },
+        'bareword followed by number');
 }
 
 # [perl #114764] Attributes leak scalars