diff options
author | Dave Mitchell <davem@fdisolutions.com> | 2003-03-18 21:55:05 +0000 |
---|---|---|
committer | Rafael Garcia-Suarez <rgarciasuarez@gmail.com> | 2003-03-18 21:59:33 +0000 |
commit | 5023d17a8090433133a90a5ff33272f2f429614f (patch) | |
tree | a98904b930f7eea7d7b53040cfd4c45434716fb1 | |
parent | aaa028762b1d77e102995e3005ce437a64e9d27f (diff) | |
download | perl-5023d17a8090433133a90a5ff33272f2f429614f.tar.gz |
[perl #9990] avoid goto &tmpsub coredump
Message-ID: <20030318215505.A16787@fdgroup.com>
p4raw-id: //depot/perl@19025
-rw-r--r-- | pp_ctl.c | 2 | ||||
-rwxr-xr-x | t/op/goto.t | 10 |
2 files changed, 11 insertions, 1 deletions
@@ -2203,6 +2203,7 @@ PP(pp_goto) } /* First do some returnish stuff. */ + SvREFCNT_inc(cv); /* avoid premature free during unwind */ FREETMPS; cxix = dopoptosub(cxstack_ix); if (cxix < 0) @@ -2250,6 +2251,7 @@ PP(pp_goto) /* Now do some callish stuff. */ SAVETMPS; + SAVEFREESV(cv); /* later, undo the 'avoid premature free' hack */ if (CvXSUB(cv)) { #ifdef PERL_XSUB_OLDSTYLE if (CvOLDSTYLE(cv)) { diff --git a/t/op/goto.t b/t/op/goto.t index 122c624324..5b30dc5f41 100755 --- a/t/op/goto.t +++ b/t/op/goto.t @@ -2,7 +2,7 @@ # "This IS structured code. It's just randomly structured." -print "1..27\n"; +print "1..28\n"; while ($?) { $foo = 1; @@ -177,6 +177,14 @@ print ($ok ? "ok 22\n" : "not ok 22\n"); print "ok 27 - weird case of goto and for(;;) loop\n"; } +# bug #9990 - don't prematurely free the CV we're &going to. + +sub f1 { + my $x; + goto sub { $x; print "ok 28 - don't prematurely free CV\n" } +} +f1(); + exit; bypass: |