summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2015-08-28 20:53:11 +0100
committerSteve Hay <steve.m.hay@googlemail.com>2015-08-28 20:53:36 +0100
commit45f3f24684363c03c905ddeea6353a16213e34e8 (patch)
tree1e2a3177bdd063b050952565ca6eb22d20e3eefd /toke.c
parentfeac78b0722d4899f9a306d5fb427fe33e82b9ab (diff)
downloadperl-45f3f24684363c03c905ddeea6353a16213e34e8.tar.gz
[perl #123893] Fix hang with "@{"
Commit v5.21.8-320-ge47d32d stopped code interpolated into quote-like operators from reading more lines of input, by making lex_next_chunk ignore the open filehandle and return false. That causes this block under case 0 in yylex to loop: if (!lex_next_chunk(fake_eof)) { CopLINE_dec(PL_curcop); s = PL_bufptr; TOKEN(';'); /* not infinite loop because rsfp is NULL now */ } (rsfp is not null there.) This commit makes it check for quote-like operators above, in the same place where it checks whether the file is open, to avoid falling through to this code that can loop. This changes the syntax errors for a couple of cases recently added to t/op/lex.t, though I think the error output is now more consis- tent overall. (cherry picked from commit 0f9d53bbcafba2b30e50a1ad22c7759be170e14a)
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/toke.c b/toke.c
index f59f913486..50e2d59197 100644
--- a/toke.c
+++ b/toke.c
@@ -5198,7 +5198,8 @@ Perl_yylex(pTHX)
if (PL_madskills)
PL_faketokens = 0;
#endif
- if (!PL_rsfp && (!PL_parser->filtered || s+1 < PL_bufend)) {
+ if ((!PL_rsfp || PL_lex_inwhat)
+ && (!PL_parser->filtered || s+1 < PL_bufend)) {
PL_last_uni = 0;
PL_last_lop = 0;
if (PL_lex_brackets &&