diff options
| author | Kevin Newton <kddnewton@gmail.com> | 2023-08-01 11:05:12 -0400 |
|---|---|---|
| committer | Takashi Kokubun <takashikkbn@gmail.com> | 2023-08-16 17:47:32 -0700 |
| commit | 242f3c3a77007c260d7d868cff3fd5f293e8aaa1 (patch) | |
| tree | ad18374110443c68a392743c852de6c49064b7e1 | |
| parent | 45efbadba55beace717eaad384c7125c801abd86 (diff) | |
[ruby/yarp] Don't read off the end when parsing % literals
https://github.com/ruby/yarp/commit/aff40871e6
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/8226
| -rw-r--r-- | yarp/yarp.c | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/yarp/yarp.c b/yarp/yarp.c index f831d03ee1..9aa4e264c6 100644 --- a/yarp/yarp.c +++ b/yarp/yarp.c @@ -6360,53 +6360,89 @@ parser_lex(yp_parser_t *parser) { switch (*parser->current.end) { case 'i': { parser->current.end++; - lex_mode_push_list(parser, false, *parser->current.end++); + + if (parser->current.end < parser->end) { + lex_mode_push_list(parser, false, *parser->current.end++); + } + LEX(YP_TOKEN_PERCENT_LOWER_I); } case 'I': { parser->current.end++; - lex_mode_push_list(parser, true, *parser->current.end++); + + if (parser->current.end < parser->end) { + lex_mode_push_list(parser, true, *parser->current.end++); + } + LEX(YP_TOKEN_PERCENT_UPPER_I); } case 'r': { parser->current.end++; - lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); - parser->current.end++; + + if (parser->current.end < parser->end) { + lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); + parser->current.end++; + } + LEX(YP_TOKEN_REGEXP_BEGIN); } case 'q': { parser->current.end++; - lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); - parser->current.end++; + + if (parser->current.end < parser->end) { + lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); + parser->current.end++; + } + LEX(YP_TOKEN_STRING_BEGIN); } case 'Q': { parser->current.end++; - lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); - parser->current.end++; + + if (parser->current.end < parser->end) { + lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); + parser->current.end++; + } + LEX(YP_TOKEN_STRING_BEGIN); } case 's': { parser->current.end++; - lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); - lex_state_set(parser, YP_LEX_STATE_FNAME | YP_LEX_STATE_FITEM); - parser->current.end++; + + if (parser->current.end < parser->end) { + lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); + lex_state_set(parser, YP_LEX_STATE_FNAME | YP_LEX_STATE_FITEM); + parser->current.end++; + } + LEX(YP_TOKEN_SYMBOL_BEGIN); } case 'w': { parser->current.end++; - lex_mode_push_list(parser, false, *parser->current.end++); + + if (parser->current.end < parser->end) { + lex_mode_push_list(parser, false, *parser->current.end++); + } + LEX(YP_TOKEN_PERCENT_LOWER_W); } case 'W': { parser->current.end++; - lex_mode_push_list(parser, true, *parser->current.end++); + + if (parser->current.end < parser->end) { + lex_mode_push_list(parser, true, *parser->current.end++); + } + LEX(YP_TOKEN_PERCENT_UPPER_W); } case 'x': { parser->current.end++; - lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); - parser->current.end++; + + if (parser->current.end < parser->end) { + lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end)); + parser->current.end++; + } + LEX(YP_TOKEN_PERCENT_LOWER_X); } default: |
