diff options
author | pommicket <pommicket@gmail.com> | 2025-09-15 13:52:32 -0400 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2025-09-15 13:52:32 -0400 |
commit | ee88497b4451225c3140f56d98ebcbc166175407 (patch) | |
tree | 39cd720c4840c2872fb065088b91658ef6d8d3d1 /pom.c | |
parent | 969bf523b7039c7038b66edde5776278c27941ac (diff) |
Errors tests; fix some non-errors
Diffstat (limited to 'pom.c')
-rw-r--r-- | pom.c | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -690,15 +690,19 @@ parse_escape_sequence(struct parser *parser, const char **p_str) { case 'u': { if (*str++ != '{') goto invalid_sequence; uint_fast32_t value = 0; - char c; - while ((c = *str++) != '}') { + int i; + for (i = 0; i < 7; i++) { + char c = *str++; + if (c == '}') break; + if (i == 6) + goto invalid_sequence; // too long int digit = parse_hex_digit(c); if (digit < 0) goto invalid_sequence; value <<= 4; value |= digit; if (value > 0x10ffff) goto invalid_sequence; } - if (value >= 0xd800 && value <= 0xdfff) + if (value == 0 || (value >= 0xd800 && value <= 0xdfff)) goto invalid_sequence; // utf-16 surrogate if (value < 0x80) { // ASCII @@ -728,10 +732,18 @@ parse_escape_sequence(struct parser *parser, const char **p_str) { static void parse_quoted_value(struct parser *parser, const char *first_line) { + uint64_t start_line_number = parser->line_number; const char *line = first_line; char delimiter = *line++; assert(delimiter == '"' || delimiter == '`'); - while (!parser->eof && !parser->out_of_memory) { + while (!parser->out_of_memory) { + if (parser->eof) { + uint64_t prev = parser->line_number; + parser->line_number = start_line_number; + parser_error(parser, ERROR_NO_CLOSING_QUOTE, delimiter); + parser->line_number = prev; + break; + } char c; while ((c = *line++)) { if (c == delimiter) { |