diff options
author | Tony Cook <tony@develop-help.com> | 2016-01-20 15:35:13 +1100 |
---|---|---|
committer | Tony Cook <tony@develop-help.com> | 2016-02-03 14:41:46 +1100 |
commit | 23c4e91245a43fb7bbe5215e27ca989e3b410552 (patch) | |
tree | 8c71325a2b7be23875d4dec17398c0bf0ef2b05e | |
parent | c95ea6823bf0611c3ce863cdc508a66b52523d34 (diff) | |
download | perl-23c4e91245a43fb7bbe5215e27ca989e3b410552.tar.gz |
[perl #125540] handle already being at EOF while not finding a heredoc terminator
In some cases, S_scan_heredoc() can already be at end of file and
PL_rsfp is NULL. If we're on the final line and that line has no
newline we'd assert or crash.
Now, if we don't find that newline, we obviously can't find the
terminator, so go straight to reporting the missing terminator.
I considered setting s to PL_bufend, but that would just be more
work to print the same message.
-rw-r--r-- | t/op/heredoc.t | 10 | ||||
-rw-r--r-- | toke.c | 5 |
2 files changed, 12 insertions, 3 deletions
diff --git a/t/op/heredoc.t b/t/op/heredoc.t index dadf1059a4..8fe0c0fdda 100644 --- a/t/op/heredoc.t +++ b/t/op/heredoc.t @@ -7,7 +7,7 @@ BEGIN { } use strict; -plan(tests => 40); +plan(tests => 41); # heredoc without newline (#65838) @@ -98,4 +98,12 @@ HEREDOC {}, "don't use an invalid oldoldbufptr" ); + + # [perl #125540] this asserted or crashed + fresh_perl_like( + q(map d$#<<<<), + qr/Can't find string terminator "" anywhere before EOF at - line 1\./, + {}, + "Don't assert parsing a here-doc if we hit EOF early" + ); } @@ -9577,9 +9577,10 @@ S_scan_heredoc(pTHX_ char *s) goto streaming; } } - else { /* eval */ + else { /* eval or we've already hit EOF */ s = (char*)memchr((void*)s, '\n', PL_bufend - s); - assert(s); + if (!s) + goto interminable; } linestr = shared->ls_linestr; bufend = SvEND(linestr); |