diff options
author | Father Chrysostomos <sprout@cpan.org> | 2012-08-20 18:06:41 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2012-08-21 14:11:02 -0700 |
commit | 62abd0d789549020431af511c02492ac374cf355 (patch) | |
tree | 4578713d6306b9700793165386a9f786ccf79fbf | |
parent | f35fca86375876704f26fde951b763c2bb533608 (diff) | |
download | perl-62abd0d789549020431af511c02492ac374cf355.tar.gz |
Don’t use strchr when scanning for newline after <<foo
The code that uses this is specifically for parsing <<foo inside a
quote-like operator inside a string eval.
This prints bar:
eval "s//<<foo/e
bar
foo
";
print $_ || $@;
This prints Can't find string terminator blah blah blah:
eval "s//<<foo/e #\0
bar
foo
";
print $_ || $@;
Nulls in comments are allowed elsewhere. This prints bar:
eval "\$_ = <<foo #\0
bar
foo
";
print $_ || $@;
The problem with strchr is that it is specifically for scanning null-
terminated strings. If embedded nulls are permitted (and should be in
this case), memchr should be used.
This code was added by 0244c3a403.
-rw-r--r-- | t/base/lex.t | 9 | ||||
-rw-r--r-- | toke.c | 2 |
2 files changed, 9 insertions, 2 deletions
diff --git a/t/base/lex.t b/t/base/lex.t index 559cc30021..2baa5dacff 100644 --- a/t/base/lex.t +++ b/t/base/lex.t @@ -1,6 +1,6 @@ #!./perl -print "1..59\n"; +print "1..60\n"; $x = 'x'; @@ -288,3 +288,10 @@ END |e '; print $_ || "not ok 59\n"; + +$_ = ""; +eval "s/(?:)/<<foo/e #\0 +ok 60 - null on same line as heredoc in s/// in eval +foo +"; +print $_ || "not ok 60\n"; @@ -9605,7 +9605,7 @@ S_scan_heredoc(pTHX_ register char *s) char * const bufend = SvEND(PL_sublex_info.super_linestr); char * const olds = s - SvCUR(herewas); term = *PL_tokenbuf; - s = strchr(bufptr, '\n'); + s = (char *)memchr((void *)bufptr, '\n', bufend-bufptr); if (!s) s = bufend; d = s; |