Browse Source

Fix non-base64 data URLs with % character not followed by hex digits (#797)

When writing accumulated "non-special" characters, `slice_start` must be
updated as some later conditionals/pattern matches don't update it like
the case when `%` is not followed by 2 hex digits.

This fixes #795
Smaug 2 years ago
parent
commit
e654efb9c1
2 changed files with 19 additions and 0 deletions
  1. 1 0
      data-url/src/lib.rs
  2. 18 0
      data-url/tests/data-urls.json

+ 1 - 0
data-url/src/lib.rs

@@ -298,6 +298,7 @@ where
             // before this special byte
             if i > slice_start {
                 write_bytes(&bytes[slice_start..i])?;
+                slice_start = i;
             }
             // Then deal with the special byte.
             match byte {

+ 18 - 0
data-url/tests/data-urls.json

@@ -52,6 +52,24 @@
   ["data:text/plain;Charset=UTF-8,%C2%B1",
    "text/plain;charset=UTF-8",
    [194, 177]],
+  ["data:text/plain,%",
+   "text/plain",
+   [37]],
+  ["data:text/plain,X%",
+   "text/plain",
+   [88, 37]],
+  ["data:text/plain,X%%",
+   "text/plain",
+   [88, 37, 37]],
+  ["data:text/plain;Charset=UTF-8,X%X",
+   "text/plain;charset=UTF-8",
+   [88, 37, 88]],
+  ["data:text/plain;Charset=UTF-8,X%0",
+   "text/plain;charset=UTF-8",
+   [88, 37, 48]],
+  ["data:text/plain;Charset=UTF-8,X%0X",
+   "text/plain;charset=UTF-8",
+   [88, 37, 48, 88]],
   ["data:text/plain;charset=windows-1252,áñçə💩",
    "text/plain;charset=windows-1252",
    [195, 161, 195, 177, 195, 167, 201, 153, 240, 159, 146, 169]],