LibWeb: Use substrings instead of pointers when parsing unicode ranges

Fixes a segfault when parsing a wildcard-only unicode range
This commit is contained in:
Gingeh 2024-11-05 21:57:25 +11:00 committed by Sam Atkins
parent ceedfb34d2
commit a4b38dda56
Notes: github-actions[bot] 2024-11-05 14:02:50 +00:00
3 changed files with 14 additions and 1 deletions

View file

@ -0,0 +1 @@
PASS (didn't crash)

View file

@ -0,0 +1,11 @@
<style>
@font-face {
unicode-range: U+??;
}
</style>
<script src="../include.js"></script>
<script>
test(() => {
println("PASS (didn't crash)");
});
</script>

View file

@ -2217,6 +2217,7 @@ Optional<Gfx::UnicodeRange> Parser::parse_unicode_range(StringView text)
// 3. Consume as many hex digits from text as possible. // 3. Consume as many hex digits from text as possible.
// then consume as many U+003F QUESTION MARK (?) code points as possible. // then consume as many U+003F QUESTION MARK (?) code points as possible.
auto start_position = lexer.tell();
auto hex_digits = lexer.consume_while(is_ascii_hex_digit); auto hex_digits = lexer.consume_while(is_ascii_hex_digit);
auto question_marks = lexer.consume_while([](auto it) { return it == '?'; }); auto question_marks = lexer.consume_while([](auto it) { return it == '?'; });
// If zero code points were consumed, or more than six code points were consumed, // If zero code points were consumed, or more than six code points were consumed,
@ -2226,7 +2227,7 @@ Optional<Gfx::UnicodeRange> Parser::parse_unicode_range(StringView text)
dbgln_if(CSS_PARSER_DEBUG, "CSSParser: <urange> start value had {} digits/?s, expected between 1 and 6.", consumed_code_points); dbgln_if(CSS_PARSER_DEBUG, "CSSParser: <urange> start value had {} digits/?s, expected between 1 and 6.", consumed_code_points);
return {}; return {};
} }
StringView start_value_code_points { hex_digits.characters_without_null_termination(), consumed_code_points }; StringView start_value_code_points = text.substring_view(start_position, consumed_code_points);
// If any U+003F QUESTION MARK (?) code points were consumed, then: // If any U+003F QUESTION MARK (?) code points were consumed, then:
if (question_marks.length() > 0) { if (question_marks.length() > 0) {