Răsfoiți Sursa

Merge pull request #655 from djc/fuzzed

Fix out of bounds slicing in Url::username()
Valentin Gosu 5 ani în urmă
părinte
comite
6f92c0843a
2 a modificat fișierele cu 9 adăugiri și 2 ștergeri
  1. 3 2
      url/src/lib.rs
  2. 6 0
      url/tests/unit.rs

+ 3 - 2
url/src/lib.rs

@@ -729,8 +729,9 @@ impl Url {
     /// # run().unwrap();
     /// ```
     pub fn username(&self) -> &str {
-        if self.has_authority() {
-            self.slice(self.scheme_end + ("://".len() as u32)..self.username_end)
+        let scheme_separator_len = "://".len() as u32;
+        if self.has_authority() && self.username_end > self.scheme_end + scheme_separator_len {
+            self.slice(self.scheme_end + scheme_separator_len..self.username_end)
         } else {
             ""
         }

+ 6 - 0
url/tests/unit.rs

@@ -665,3 +665,9 @@ fn test_set_scheme_to_file_with_host() {
     assert_eq!(url.to_string(), "http://localhost:6767/foo/bar");
     assert_eq!(result, Err(()));
 }
+
+#[test]
+fn no_panic() {
+    let mut url = Url::parse("arhttpsps:/.//eom/dae.com/\\\\t\\:").unwrap();
+    url::quirks::set_hostname(&mut url, "//eom/datcom/\\\\t\\://eom/data.cs").unwrap();
+}