@@ -9653,7 +9653,8 @@ escape_read_warn(pm_parser_t *parser, uint8_t flags, uint8_t flag, const char *t
96539653 */
96549654static void
96559655escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expression_buffer, uint8_t flags) {
9656- switch (peek(parser)) {
9656+ uint8_t peeked = peek(parser);
9657+ switch (peeked) {
96579658 case '\\': {
96589659 parser->current.end++;
96599660 escape_write_byte(parser, buffer, regular_expression_buffer, flags, escape_byte('\\', flags));
@@ -9723,6 +9724,7 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre
97239724 }
97249725 }
97259726
9727+ value = escape_byte(value, flags);
97269728 escape_write_byte(parser, buffer, regular_expression_buffer, flags, value);
97279729 return;
97289730 }
@@ -10050,6 +10052,11 @@ escape_read(pm_parser_t *parser, pm_buffer_t *buffer, pm_buffer_t *regular_expre
1005010052 PRISM_FALLTHROUGH
1005110053 }
1005210054 default: {
10055+ if ((flags & (PM_ESCAPE_FLAG_CONTROL | PM_ESCAPE_FLAG_META)) && !char_is_ascii_printable(peeked)) {
10056+ size_t width = parser->encoding->char_width(parser->current.end, parser->end - parser->current.end);
10057+ pm_parser_err(parser, parser->current.start, parser->current.end + width, PM_ERR_ESCAPE_INVALID_META);
10058+ return;
10059+ }
1005310060 if (parser->current.end < parser->end) {
1005410061 escape_write_escape_encoded(parser, buffer, regular_expression_buffer, flags);
1005510062 } else {
0 commit comments