[perl #115992] PL_eval_start use-after-free
authorDavid Mitchell <davem@iabyn.com>
Fri, 7 Dec 2012 11:07:30 +0000 (11:07 +0000)
committerDavid Mitchell <davem@iabyn.com>
Fri, 7 Dec 2012 11:07:30 +0000 (11:07 +0000)
commiteae139f3f1da0f91ca0fb543c5f5bc3b2b94cbc9
treebcb933901688ccab02faa890393d08c5da80d562
parentcf7631f2e53782c31bd8f9b7c65010525a4cdcbc
[perl #115992] PL_eval_start use-after-free

PL_eval_start is used for two purposes.

First, it indicates the start op of a freshly-compiled eval. It is set in
newPROG(), and used by entereval etc to know where to begin executing.
After execution has begun, its value is meaningless (and may well point
to a freed op).

Second, it's used as a temporary pointer to indicate, within an assignment
to $] (which has been optimised into a const), that it's not to croak in
op_lvalue() with "Can't modify constant item", but instead to set
CopARYBASE.

This second use temporarily sets it in Perl_newASSIGNOP(), which calls
op_lvalue(), which uses and then clears it. The issue is that it can also
be left set by a previous eval, so something like 'local $[' will see it
set and try to use its value.

The quickest fix is to just set it NULL directly after each eval where its
used.

This change has been applied directly to maint-5.14 rather than going via
bleed, since the old $[ mechanism was ripped out for 5.15.3.
pp_ctl.c