This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
S_require_tie_mod(): use a new stack
authorDavid Mitchell <davem@iabyn.com>
Tue, 14 Mar 2017 09:19:15 +0000 (09:19 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 5 Jun 2017 13:39:37 +0000 (14:39 +0100)
commit655f5b268af8bf50c44ba4ae4803a33c9b792b8b
tree585da2a46f420b39276f5ff9cc8ca6007393aea3
parentf21038656da352686689ac9b4c5197596eba771d
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.
gv.c
pp.c
t/op/ref.t