This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix leak on syntax error in main prog
authorDavid Mitchell <davem@iabyn.com>
Mon, 11 Mar 2019 16:18:10 +0000 (16:18 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 11 Mar 2019 16:33:34 +0000 (16:33 +0000)
t/lib/croak.t was failing several tests under ASan because it was
running small stand-alone programs with some sort of error in, such as

    BEGIN { }
    myfunc 1;

Unlike other code paths (such as S_doeval_compile() for evals),
Perl_newPROG() - when called for the main body rather than for a
completed eval - was calling cv_forget_slab() on PL_compcv regardless of
whether an error was present. That call converts  the compiling CV into
a compiled one, which disclaims ownership of the slab(s) its ops are
embedded in. This means that when the CV is freed, ops within the slab
which aren't embedded within the PL_main_root tree would leak.

Such ops may exist when Perl_newPROG() is reached after one of more
errors.

The fix is simply to not call cv_forget_slab() if the error count is > 0.

op.c

diff --git a/op.c b/op.c
index 31491fb..4e49eee 100644 (file)
--- a/op.c
+++ b/op.c
@@ -5415,7 +5415,10 @@ Perl_newPROG(pTHX_ OP *o)
         start = LINKLIST(PL_main_root);
        PL_main_root->op_next = 0;
         S_process_optree(aTHX_ NULL, PL_main_root, start);
-       cv_forget_slab(PL_compcv);
+        if (!PL_parser->error_count)
+            /* on error, leave CV slabbed so that ops left lying around
+             * will eb cleaned up. Else unslab */
+            cv_forget_slab(PL_compcv);
        PL_compcv = 0;
 
        /* Register with debugger */