[perl #125679] Don’t make lvref ops on error blead
authorFather Chrysostomos <sprout@cpan.org>
Sun, 28 Aug 2016 14:21:19 +0000 (07:21 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 28 Aug 2016 14:21:39 +0000 (07:21 -0700)
When converting an op into an lvref op (the rv2av in \(@_)=... gets
converted while the refgen gets nulled), if we reject the op as a
valid one for refaliasing we should not go ahead and convert it.  It
we do convert it (as we were doing), then we may convert an op that
uses op_targ for auxiliary information into one that uses it as a pad
offset.  When freeing the op, we will then be reading a ‘random’ off-
set in the pad and trying to free the SV.  That pad entry may not even
be within the pad.

In the specific case of entereval, op_targ holds the hints, and the
larger the value of $^H, the more likely it is to crash.  So
BEGIN{$^H=-1}\eval=... will crash.

op.c
t/comp/parser.t

index 693828f..cedc5e8 100644 (file)
--- a/op.c
+++ b/op.c
@@ -2839,6 +2839,7 @@ S_lvref(pTHX_ OP *o, I32 type)
                      ? "do block"
                      : OP_DESC(o),
                     PL_op_desc[type]));
+       return;
     }
     OpTYPE_set(o, OP_LVREF);
     o->op_private &=
index 5ca07ea..981f265 100644 (file)
@@ -540,6 +540,9 @@ eval "grep+grep";
  eval 'my $_; m// ~~ 0';
 }
 
+# Used to crash [perl #125679]
+eval 'BEGIN {$^H=-1} \eval=time';
+
 # RT #124207 syntax error during stringify can leave stringify op
 # with multiple children and assertion failures