Browse Source

LibWeb: Use substrings instead of pointers when parsing unicode ranges

Fixes a segfault when parsing a wildcard-only unicode range
Gingeh 8 months ago
parent
commit
a4b38dda56

+ 1 - 0
Tests/LibWeb/Text/expected/css/unicode-range-all-wildcard.txt

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

+ 11 - 0
Tests/LibWeb/Text/input/css/unicode-range-all-wildcard.html

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

+ 2 - 1
Userland/Libraries/LibWeb/CSS/Parser/Parser.cpp

@@ -2217,6 +2217,7 @@ Optional<Gfx::UnicodeRange> Parser::parse_unicode_range(StringView text)
 
     // 3. Consume as many hex digits from text 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 question_marks = lexer.consume_while([](auto it) { return it == '?'; });
     //    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);
         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 (question_marks.length() > 0) {