summaryrefslogtreecommitdiff
path: root/pp_hot.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-09-06 08:30:41 -0700
committerFather Chrysostomos <sprout@cpan.org>2013-09-06 23:25:49 -0700
commit8c9d3376fbfa04ec0e0e2164dcf7d9e824cf0e94 (patch)
treed7a979047d5b68fbfe6d7997270062787f830de6 /pp_hot.c
parent425b8234618a94b12ca70c9914e5818c3952c7ed (diff)
downloadperl-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.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/pp_hot.c b/pp_hot.c
index 2598ef0f58..03ce10263d 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -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 */