summaryrefslogtreecommitdiff
path: root/gv.c
diff options
context:
space:
mode:
authorDavid Mitchell <davem@iabyn.com>2017-03-14 09:19:15 +0000
committerDavid Mitchell <davem@iabyn.com>2017-06-05 14:39:37 +0100
commit655f5b268af8bf50c44ba4ae4803a33c9b792b8b (patch)
tree585da2a46f420b39276f5ff9cc8ca6007393aea3 /gv.c
parentf21038656da352686689ac9b4c5197596eba771d (diff)
downloadperl-655f5b268af8bf50c44ba4ae4803a33c9b792b8b.tar.gz
S_require_tie_mod(): use a new stack
RT #130861 This function is used to load a module associated with various magic vars, like $[ and %+. Since it can be called 'unexpectedly', it should use a new stack. The issue in this ticket was equivalent to my $var = '['; $$var; where the symbolic dereference triggered a run-time load of arybase.pm, which grew the stack, invalidating the SP in pp_rv2sv. Note that most of the stuff which S_require_tie_mod() calls, such as load_module(), will do its own PUSHSTACK(); but S_require_tie_mod() also does a bit of stack manipulation itself. The test case includes a magic number, 125, which happens to be the exact size necessary to trigger a stack realloc in S_require_tie_mod(). In later perl versions this value may well change. But it seemed too expensive to call fresh_perl_is() 100's of times with different values of $n. This commit also adds a SPAGAIN to pp_rv2sv on the 'belt and braces' principle. This commit is based on an earlier effort by Aaron Crane.
Diffstat (limited to 'gv.c')
-rw-r--r--gv.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/gv.c b/gv.c
index 81fa5de631..ea41e78725 100644
--- a/gv.c
+++ b/gv.c
@@ -1339,6 +1339,7 @@ S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name,
GV **gvp;
dSP;
+ PUSHSTACKi(PERLSI_MAGIC);
ENTER;
#define HV_FETCH_TIE_FUNC (GV **)hv_fetchs(stash, "_tie_it", 0)
@@ -1368,6 +1369,7 @@ S_require_tie_mod(pTHX_ GV *gv, const char varname, const char * name,
PUTBACK;
call_sv((SV *)*gvp, G_VOID|G_DISCARD);
LEAVE;
+ POPSTACK;
}
}