This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #123712] Fix /$a[/ parsing
authorFather Chrysostomos <sprout@cpan.org>
Mon, 16 Feb 2015 01:11:47 +0000 (17:11 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 16 Feb 2015 01:28:03 +0000 (17:28 -0800)
commite47d32dcd59a578274f445fac79e977d83055c8c
treee20955eff371c75507e9cc2c8ed598bdb3137f87
parentf36b6700b62dc209a8e6142efd1cbfbf8c14457c
[perl #123712] Fix /$a[/ parsing

The parser used to read more lines of input when parsing code interpo-
lated into quote-like operators, under some circumstance.  This would
result in code like this working, even though it should be a syn-
tax error:

s||${s/.*/|;
/s}Just another Perl hacker,
print

"${;s/.*/Just an";
other Perl hacker,
/s} die or return;
print

While this was harmless, other cases, like /$a[/<<a with no trailing
newline, would cause unexpected internal state that did not meet the
reasonable assumptions made by S_scan_heredoc, resulting in a crash.

The simplest fix is to modify the function that reads more input,
namely, lex_next_chunk, and prevent it from reading more lines of
input from inside a quote-like operator.  (The alternative would be to
modify all the calls to lex_next_chunk, and make them conditional.)
That breaks here-doc parsing for things like s//<<EOF/, but the
LEX_NO_TERM flag to lex_next_chunk is used only by the here-doc
parser, so lex_next_chunk can make an exception if it is set.
t/op/lex.t
toke.c