diff options
author | David Mitchell <davem@iabyn.com> | 2017-07-16 20:00:01 +0100 |
---|---|---|
committer | David Mitchell <davem@iabyn.com> | 2017-07-16 20:00:01 +0100 |
commit | 978b185906e439ce6a0fcb8e90c8e3f328556a8a (patch) | |
tree | 30340c56c37949f3a8c9bbfa6b4eb0f8ccde6bb2 /dump.c | |
parent | ab9a6a636dbb66ae5bf3f7546a87872aa295f96d (diff) | |
download | perl-978b185906e439ce6a0fcb8e90c8e3f328556a8a.tar.gz |
PL_curstackinfo->si_stack_hwm: gently restore
RT #131732
With v5.27.1-66-g87058c3, I introduced a DEBUGGING-only mechanism in the
runops loop for checking whether an op extended the stack by as many slots
as values it returned on the stack. It did this by setting a
high-water-mark just before calling each pp function, and checking its
result on return.
It saved and restored the old value of PL_curstackinfo->si_stack_hwm
whenever it entered or left a runops loop or did a JMPENV_PUSH /
JMPENV_POP. However, the restoring could restore to an old value that was
smaller than the current value, leading to false-positive stack-extend
panics. So only restore if the old value was larger.
In particular this was causing false positives in DBI.
Diffstat (limited to 'dump.c')
-rw-r--r-- | dump.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -2467,7 +2467,8 @@ Perl_runops_debug(pTHX) PERL_ASYNC_CHECK(); #if defined DEBUGGING && !defined DEBUGGING_RE_ONLY - PL_curstackinfo->si_stack_hwm = orig_stack_hwm; + if (PL_curstackinfo->si_stack_hwm < orig_stack_hwm) + PL_curstackinfo->si_stack_hwm = orig_stack_hwm; #endif TAINT_NOT; return 0; |