summaryrefslogtreecommitdiff
path: root/toke.c
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2017-11-06 14:12:41 -0700
committerKarl Williamson <khw@cpan.org>2017-11-06 14:31:45 -0700
commitc6875f946df1255aa7617d8239504e8186077df9 (patch)
tree0b9c22fae1059ca905999c1313407e7d62f6e758 /toke.c
parent43b2f4ef399e2fd7240b4eeb0658686ad95f8e62 (diff)
downloadperl-c6875f946df1255aa7617d8239504e8186077df9.tar.gz
toke.c: Add limit parameter to 3 static functions
This will make it possible to fix to handle embedded NULs in the next commits.
Diffstat (limited to 'toke.c')
-rw-r--r--toke.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/toke.c b/toke.c
index 159e2ae6ec..a60d16b670 100644
--- a/toke.c
+++ b/toke.c
@@ -556,7 +556,7 @@ S_no_op(pTHX_ const char *const what, char *s)
*/
STATIC void
-S_missingterm(pTHX_ char *s)
+S_missingterm(pTHX_ char *s, const STRLEN len)
{
char tmpbuf[UTF8_MAXBYTES + 1];
char q;
@@ -1572,7 +1572,7 @@ Perl_lex_read_space(pTHX_ U32 flags)
if (s == bufend)
need_incline = 1;
else
- incline(s);
+ incline(s, bufend);
}
} else if (isSPACE(c)) {
s++;
@@ -1591,7 +1591,7 @@ Perl_lex_read_space(pTHX_ U32 flags)
if (!got_more)
break;
if (can_incline && need_incline && PL_parser->rsfp) {
- incline(s);
+ incline(s, bufend);
need_incline = 0;
}
} else if (!c) {
@@ -1724,7 +1724,7 @@ Perl_validate_proto(pTHX_ SV *name, SV *proto, bool warn, bool curstash)
*/
STATIC void
-S_incline(pTHX_ const char *s)
+S_incline(pTHX_ const char *s, const char *end)
{
const char *t;
const char *n;
@@ -4142,7 +4142,7 @@ S_scan_const(pTHX_ char *start)
/* This is the one truly awful dwimmer necessary to conflate C and sed. */
STATIC int
-S_intuit_more(pTHX_ char *s)
+S_intuit_more(pTHX_ char *s, char *e)
{
PERL_ARGS_ASSERT_INTUIT_MORE;
@@ -4976,7 +4976,7 @@ Perl_yylex(pTHX)
return yylex();
case LEX_INTERPENDMAYBE:
- if (intuit_more(PL_bufptr)) {
+ if (intuit_more(PL_bufptr, PL_bufend)) {
PL_lex_state = LEX_INTERPNORMAL; /* false alarm, more expr */
break;
}
@@ -5384,7 +5384,7 @@ Perl_yylex(pTHX)
}
}
if (PL_rsfp || PL_parser->filtered)
- incline(s);
+ incline(s, PL_bufend);
} while (PL_parser->in_pod);
PL_oldoldbufptr = PL_oldbufptr = PL_bufptr = PL_linestart = s;
PL_bufend = SvPVX(PL_linestr) + SvCUR(PL_linestr);
@@ -5609,7 +5609,7 @@ Perl_yylex(pTHX)
&& !PL_rsfp && !PL_parser->filtered) {
/* handle eval qq[#line 1 "foo"\n ...] */
CopLINE_dec(PL_curcop);
- incline(s);
+ incline(s, PL_bufend);
}
d = s;
while (d < PL_bufend && *d != '\n')
@@ -5622,7 +5622,7 @@ Perl_yylex(pTHX)
&& PL_lex_inwhat == OP_SUBST && PL_lex_repl == PL_linestr
&& SvEVALED(PL_lex_repl) && d[-1] == '}') s--;
else
- incline(s);
+ incline(s, PL_bufend);
if (PL_lex_formbrack && PL_lex_brackets <= PL_lex_formbrack) {
PL_lex_state = LEX_FORMLINE;
force_next(FORMRBRACK);
@@ -5636,7 +5636,7 @@ Perl_yylex(pTHX)
{
s++;
if (s < PL_bufend)
- incline(s);
+ incline(s, PL_bufend);
}
}
goto retry;
@@ -5837,7 +5837,8 @@ Perl_yylex(pTHX)
if (!PL_tokenbuf[1]) {
PREREF('%');
}
- if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
+ if ( (PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
+ && intuit_more(s, PL_bufend)) {
if (*s == '[')
PL_tokenbuf[0] = '@';
}
@@ -6439,14 +6440,14 @@ Perl_yylex(pTHX)
d = PL_bufend;
while (s < d) {
if (*s++ == '\n') {
- incline(s);
+ incline(s, PL_bufend);
if (strBEGINs(s,"=cut")) {
s = strchr(s,'\n');
if (s)
s++;
else
s = d;
- incline(s);
+ incline(s, PL_bufend);
goto retry;
}
}
@@ -6670,8 +6671,8 @@ Perl_yylex(pTHX)
if (PL_lex_state == LEX_NORMAL || PL_lex_brackets)
s = skipspace(s);
- if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
- && intuit_more(s)) {
+ if ( (PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
+ && intuit_more(s, PL_bufend)) {
if (*s == '[') {
PL_tokenbuf[0] = '@';
if (ckWARN(WARN_SYNTAX)) {
@@ -6799,7 +6800,9 @@ Perl_yylex(pTHX)
}
if (PL_lex_state == LEX_NORMAL)
s = skipspace(s);
- if ((PL_expect != XREF || PL_oldoldbufptr == PL_last_lop) && intuit_more(s)) {
+ if ( (PL_expect != XREF || PL_oldoldbufptr == PL_last_lop)
+ && intuit_more(s, PL_bufend))
+ {
if (*s == '{')
PL_tokenbuf[0] = '%';
@@ -6910,7 +6913,7 @@ Perl_yylex(pTHX)
case '\'':
s = scan_str(s,FALSE,FALSE,FALSE,NULL);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
COPLINE_SET_FROM_MULTI_END;
DEBUG_T( { printbuf("### Saw string before %s\n", s); } );
if (PL_expect == XOPERATOR) {
@@ -6932,7 +6935,7 @@ Perl_yylex(pTHX)
no_op("String",s);
}
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
pl_yylval.ival = OP_CONST;
/* FIXME. I think that this can be const if char *d is replaced by
more localised variables. */
@@ -6958,7 +6961,7 @@ Perl_yylex(pTHX)
if (PL_expect == XOPERATOR)
no_op("Backticks",s);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
pl_yylval.ival = OP_BACKTICK;
TERM(sublex_start());
@@ -8334,7 +8337,7 @@ Perl_yylex(pTHX)
case KEY_q:
s = scan_str(s,FALSE,FALSE,FALSE,NULL);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
COPLINE_SET_FROM_MULTI_END;
pl_yylval.ival = OP_CONST;
TERM(sublex_start());
@@ -8346,7 +8349,7 @@ Perl_yylex(pTHX)
OP *words = NULL;
s = scan_str(s,FALSE,FALSE,FALSE,NULL);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
COPLINE_SET_FROM_MULTI_END;
PL_expect = XOPERATOR;
if (SvCUR(PL_lex_stuff)) {
@@ -8395,7 +8398,7 @@ Perl_yylex(pTHX)
case KEY_qq:
s = scan_str(s,FALSE,FALSE,FALSE,NULL);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
pl_yylval.ival = OP_STRINGIFY;
if (SvIVX(PL_lex_stuff) == '\'')
SvIV_set(PL_lex_stuff, 0); /* qq'$foo' should interpolate */
@@ -8408,7 +8411,7 @@ Perl_yylex(pTHX)
case KEY_qx:
s = scan_str(s,FALSE,FALSE,FALSE,NULL);
if (!s)
- missingterm(NULL);
+ missingterm(NULL, 0);
pl_yylval.ival = OP_BACKTICK;
TERM(sublex_start());
@@ -9537,7 +9540,9 @@ S_scan_ident(pTHX_ char *s, char *dest, STRLEN destlen, I32 ck_uni)
*dest = '\0';
}
}
- else if (PL_lex_state == LEX_INTERPNORMAL && !PL_lex_brackets && !intuit_more(s))
+ else if ( PL_lex_state == LEX_INTERPNORMAL
+ && !PL_lex_brackets
+ && !intuit_more(s, PL_bufend))
PL_lex_state = LEX_INTERPEND;
return s;
}
@@ -10286,7 +10291,7 @@ S_scan_heredoc(pTHX_ char *s)
interminable:
SvREFCNT_dec(tmpstr);
CopLINE_set(PL_curcop, origline);
- missingterm(PL_tokenbuf + 1);
+ missingterm(PL_tokenbuf + 1, sizeof(PL_tokenbuf) - 1);
}
/* scan_inputsymbol
@@ -11466,7 +11471,7 @@ S_scan_formline(pTHX_ char *s)
if (!got_some)
break;
}
- incline(s);
+ incline(s, PL_bufend);
}
enough:
if (!SvCUR(stuff) || needargs)