In perl.git, the branch blead has been updated <http://perl5.git.perl.org/perl.git/commitdiff/8ed49485fa2d8dfdc87e0a7a269aa210d3e6da83?hp=3c5d942fb372701fbc63076211d0fa17b8c2b6a2>
- Log ----------------------------------------------------------------- commit 8ed49485fa2d8dfdc87e0a7a269aa210d3e6da83 Author: Father Chrysostomos <[email protected]> Date: Wed Sep 22 23:47:11 2010 -0700 [perl #70614] Seg. fault with eval/use/UNITCHECK/DESTROY/eval combination This case can be reduced to: eval "UNITCHECK{ eval 0 }" (eval 0 triggers the bug more reliably than eval ''.) The inner eval clobbers PL_eval_start, so when the UNITCHECK finishes, the outer eval tries to call the inner evalâs code, which has been freed already. This commit saves PL_eval_start and restores it after UNITCHECK. ----------------------------------------------------------------------- Summary of changes: pp_ctl.c | 5 ++++- t/op/blocks.t | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pp_ctl.c b/pp_ctl.c index 0a9dcfe..601a25c 100644 --- a/pp_ctl.c +++ b/pp_ctl.c @@ -3255,8 +3255,11 @@ S_doeval(pTHX_ int gimme, OP** startop, CV* outside, U32 seq) } } - if (PL_unitcheckav) + if (PL_unitcheckav) { + OP *es = PL_eval_start; call_list(PL_scopestack_ix, PL_unitcheckav); + PL_eval_start = es; + } /* compiled okay, so do it */ diff --git a/t/op/blocks.t b/t/op/blocks.t index 476d9ea..717be4c 100644 --- a/t/op/blocks.t +++ b/t/op/blocks.t @@ -6,7 +6,7 @@ BEGIN { require './test.pl'; } -plan tests => 3; +plan tests => 4; my @expect = qw( b1 @@ -105,3 +105,7 @@ sub CHECK {print ":check"} sub INIT {print ":init"} sub END {print ":end"} SCRIPT3 + +fresh_perl_is(<<'SCRIPT70614', "still here",{switches => [''], stdin => '', stderr => 1 },'eval-UNITCHECK-eval (bug 70614)'); +eval "UNITCHECK { eval 0 }"; print "still here"; +SCRIPT70614 -- Perl5 Master Repository
