This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fix crash with: undef *_; shift;
authorFather Chrysostomos <sprout@cpan.org>
Tue, 17 May 2016 07:03:09 +0000 (00:03 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Tue, 17 May 2016 07:24:47 +0000 (00:24 -0700)
Commit v5.13.0-149-g538f575 added on optimisation to shift() that
makes pp_shift fetch @_ directly, instead of having two separate ops.

Unfortunately, it used the wrong macro, namely GvAV, instead of GvAVn.
The latter makes sure the array actually exists.

pp.c
t/op/array.t

diff --git a/pp.c b/pp.c
index 2794707..5010065 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -5563,7 +5563,7 @@ PP(pp_shift)
 {
     dSP;
     AV * const av = PL_op->op_flags & OPf_SPECIAL
-       ? MUTABLE_AV(GvAV(PL_defgv)) : MUTABLE_AV(POPs);
+       ? MUTABLE_AV(GvAVn(PL_defgv)) : MUTABLE_AV(POPs);
     SV * const sv = PL_op->op_type == OP_SHIFT ? av_shift(av) : av_pop(av);
     EXTEND(SP, 1);
     assert (sv);
index 4f0a772..c8513d1 100644 (file)
@@ -555,4 +555,7 @@ is $#foo, 3, 'assigning to arylen aliased in foreach(scalar $#arylen)';
     is "@a", 'a b c', 'assigning to itself';
 }
 
+sub { undef *_; shift }->(); # This would crash; no ok() necessary.
+sub { undef *_; pop   }->();
+
 "We're included by lib/Tie/Array/std.t so we need to return something true";