diff options
author | Father Chrysostomos <sprout@cpan.org> | 2013-09-06 08:30:41 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2013-09-06 23:25:49 -0700 |
commit | 8c9d3376fbfa04ec0e0e2164dcf7d9e824cf0e94 (patch) | |
tree | d7a979047d5b68fbfe6d7997270062787f830de6 /pp_hot.c | |
parent | 425b8234618a94b12ca70c9914e5818c3952c7ed (diff) | |
download | perl-8c9d3376fbfa04ec0e0e2164dcf7d9e824cf0e94.tar.gz |
Stop &xsub and goto &xsub from crashing on undef *_
$ perl -e 'undef *_; &Internals::V'
Segmentation fault: 11
$ perl -e 'sub { undef *_; goto &Internals::V }->()'
$ perl5.18.1 -e 'sub { undef *_; goto &Internals::V }->()'
Segmentation fault: 11
The goto case is actually a regression from 5.16 (049bd5ffd62), as
goto used to ignore changes to *_. (Fixing one bug uncovers another.)
We shouldn’t assume that GvAV(PL_defgv) (*_{ARRAY}) gives us anything.
While we’re at it, since we have to add extra checks anyway, use them
to speed up empty @_ in goto (by checking items, rather than arg).
Diffstat (limited to 'pp_hot.c')
-rw-r--r-- | pp_hot.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -2714,7 +2714,7 @@ try_autoload: !CvLVALUE(cv)) DIE(aTHX_ "Can't modify non-lvalue subroutine call"); - if (!hasargs) { + if (!hasargs && GvAV(PL_defgv)) { /* Need to copy @_ to stack. Alternative may be to * switch stack to @_, and copy return values * back. This would allow popping @_ in XSUB, e.g.. XXXX */ |