Skip to content

Commit aff4087

Browse files
committed
Don't read off the end when parsing % literals
1 parent 9973944 commit aff4087

File tree

1 file changed

+51
-15
lines changed

1 file changed

+51
-15
lines changed

src/yarp.c

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6387,53 +6387,89 @@ parser_lex(yp_parser_t *parser) {
63876387
switch (*parser->current.end) {
63886388
case 'i': {
63896389
parser->current.end++;
6390-
lex_mode_push_list(parser, false, *parser->current.end++);
6390+
6391+
if (parser->current.end < parser->end) {
6392+
lex_mode_push_list(parser, false, *parser->current.end++);
6393+
}
6394+
63916395
LEX(YP_TOKEN_PERCENT_LOWER_I);
63926396
}
63936397
case 'I': {
63946398
parser->current.end++;
6395-
lex_mode_push_list(parser, true, *parser->current.end++);
6399+
6400+
if (parser->current.end < parser->end) {
6401+
lex_mode_push_list(parser, true, *parser->current.end++);
6402+
}
6403+
63966404
LEX(YP_TOKEN_PERCENT_UPPER_I);
63976405
}
63986406
case 'r': {
63996407
parser->current.end++;
6400-
lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6401-
parser->current.end++;
6408+
6409+
if (parser->current.end < parser->end) {
6410+
lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6411+
parser->current.end++;
6412+
}
6413+
64026414
LEX(YP_TOKEN_REGEXP_BEGIN);
64036415
}
64046416
case 'q': {
64056417
parser->current.end++;
6406-
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6407-
parser->current.end++;
6418+
6419+
if (parser->current.end < parser->end) {
6420+
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6421+
parser->current.end++;
6422+
}
6423+
64086424
LEX(YP_TOKEN_STRING_BEGIN);
64096425
}
64106426
case 'Q': {
64116427
parser->current.end++;
6412-
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6413-
parser->current.end++;
6428+
6429+
if (parser->current.end < parser->end) {
6430+
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6431+
parser->current.end++;
6432+
}
6433+
64146434
LEX(YP_TOKEN_STRING_BEGIN);
64156435
}
64166436
case 's': {
64176437
parser->current.end++;
6418-
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6419-
lex_state_set(parser, YP_LEX_STATE_FNAME | YP_LEX_STATE_FITEM);
6420-
parser->current.end++;
6438+
6439+
if (parser->current.end < parser->end) {
6440+
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6441+
lex_state_set(parser, YP_LEX_STATE_FNAME | YP_LEX_STATE_FITEM);
6442+
parser->current.end++;
6443+
}
6444+
64216445
LEX(YP_TOKEN_SYMBOL_BEGIN);
64226446
}
64236447
case 'w': {
64246448
parser->current.end++;
6425-
lex_mode_push_list(parser, false, *parser->current.end++);
6449+
6450+
if (parser->current.end < parser->end) {
6451+
lex_mode_push_list(parser, false, *parser->current.end++);
6452+
}
6453+
64266454
LEX(YP_TOKEN_PERCENT_LOWER_W);
64276455
}
64286456
case 'W': {
64296457
parser->current.end++;
6430-
lex_mode_push_list(parser, true, *parser->current.end++);
6458+
6459+
if (parser->current.end < parser->end) {
6460+
lex_mode_push_list(parser, true, *parser->current.end++);
6461+
}
6462+
64316463
LEX(YP_TOKEN_PERCENT_UPPER_W);
64326464
}
64336465
case 'x': {
64346466
parser->current.end++;
6435-
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6436-
parser->current.end++;
6467+
6468+
if (parser->current.end < parser->end) {
6469+
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
6470+
parser->current.end++;
6471+
}
6472+
64376473
LEX(YP_TOKEN_PERCENT_LOWER_X);
64386474
}
64396475
default:

0 commit comments

Comments
 (0)