소스 검색

LibWeb: Actually run UTF-8 decode without BOM

This fixes a crash using URLSearchParams when provided a percent encoded
string which does not percent decode to valid UTF-8.

Fixes a crash running https://wpt.live/url/urlencoded-parser.any.html
Shannon Booth 11 달 전
부모
커밋
9c72fc9642

+ 2 - 0
Tests/LibWeb/Text/expected/URL/search-params-with-invalid-utf8.txt

@@ -0,0 +1,2 @@
+key equals   = true
+value equals = true

+ 10 - 0
Tests/LibWeb/Text/input/URL/search-params-with-invalid-utf8.html

@@ -0,0 +1,10 @@
+<script src="../include.js"></script>
+<script>
+    test(() => {
+        const params = new URLSearchParams('%FE%FF');
+        for (const [key, value] of params) {
+            println(`key equals   = ${"\uFFFD\uFFFD" === key}`);
+            println(`value equals = ${"" === value}`);
+        }
+    });
+</script>

+ 2 - 2
Userland/Libraries/LibWeb/DOMURL/URLSearchParams.cpp

@@ -115,8 +115,8 @@ ErrorOr<Vector<QueryParam>> url_decode(StringView input)
         auto space_decoded_name = name.replace("+"sv, " "sv, ReplaceMode::All);
 
         // 5. Let nameString and valueString be the result of running UTF-8 decode without BOM on the percent-decoding of name and value, respectively.
-        auto name_string = TRY(String::from_byte_string(URL::percent_decode(space_decoded_name)));
-        auto value_string = TRY(String::from_byte_string(URL::percent_decode(value)));
+        auto name_string = String::from_utf8_with_replacement_character(URL::percent_decode(space_decoded_name));
+        auto value_string = String::from_utf8_with_replacement_character(URL::percent_decode(value));
 
         TRY(output.try_empend(move(name_string), move(value_string)));
     }