]> git.vpit.fr Git - perl/modules/Scope-Upper.git/commitdiff
su_uplevel: populate lower stack frames properly
authorDavid Mitchell <davem@iabyn.com>
Thu, 19 May 2016 11:03:48 +0000 (12:03 +0100)
committerVincent Pit <perl@profvince.com>
Mon, 30 May 2016 12:35:44 +0000 (14:35 +0200)
When creating a temporary new argument stack, su_uplevel() copies most of
the old stack to a new one. This isn't really needed, as the new stack
will be abandoned before it ever pops back to that level.  But it *is*
needed when debugging code prints out the stack, as in for example,
'perl -Dstv'.

However, the code didn't actually copy the old stack: it copied garbage
instead, since it was using PL_curstack rather than AvARRAY(PL_curstack)
as the address of of the old stack. Which was causing 'perl -Dstv' to
SEGV.

This commit fixes that.

Upper.xs

index f6e678d405a2c4a5f493a428557db5572f10df44..f7698d8a3dbb282826e02aa98f528bfe8b225ba0 100644 (file)
--- a/Upper.xs
+++ b/Upper.xs
@@ -1984,7 +1984,7 @@ static I32 su_uplevel(pTHX_ CV *callback, I32 cxix, I32 args) {
   * target context, plus the forthcoming arguments. */
  new_mark = cx->blk_oldsp;
  av_extend(si->si_stack, new_mark + 1 + args + 1);
- Copy(PL_curstack, AvARRAY(si->si_stack), new_mark + 1, SV *);
+ Copy(AvARRAY(PL_curstack), AvARRAY(si->si_stack), new_mark + 1, SV *);
  AvFILLp(si->si_stack) = new_mark;
  SU_POISON(AvARRAY(si->si_stack) + new_mark + 1, args + 1, SV *);