[perl #123652] eval {label:} crash
authorFather Chrysostomos <sprout@cpan.org>
Sun, 25 Jan 2015 01:14:58 +0000 (17:14 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Sun, 25 Jan 2015 01:23:11 +0000 (17:23 -0800)
commit2f465e08eb39981706429873d24e3bcc18015bfb
treead5612bfcf5df0f082059d1e1e3ad7de78c9f6ab
parentd0500f096808fa409ac4682e66b531b365a56293
[perl #123652] eval {label:} crash

As of v5.13.6-130-geae48c8, the block consists solely of a
nextstate op.

The code in ck_eval that distinguished between eval-block and eval-
string was checking the type of the kid op (looking for lineseq or
stub) instead of simply checking the type of the op itself (entertry/
entereval).

The lexer was already making the distinction between the two but op.c
was ignoring the information provided by the lexer.

Usually

  entertry(unop)
    kid

gets converted into

  leavetry
    entertry(logop)
    kid

with the entertry reallocated as a larger-sized op, but that was not
happening.  The peephole optimiser assumed it had happened, and fol-
lowed the cLOGOPo->op_other pointer, which is unrelated junk beyond
the end of the unop struct.  Hence the crash.
op.c
t/comp/parser.t