Skip to content

Commit 08a3268

Browse files
authored
OSS-Fuzz: Add more fuzzers (#988)
Signed-off-by: Arthur Chan <[email protected]>
1 parent 5d363cc commit 08a3268

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed

url/fuzz/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,9 @@ path = ".."
1818
name = "parse"
1919
path = "fuzz_targets/parse.rs"
2020

21+
[[bin]]
22+
name = "fuzz-url"
23+
path = "fuzz_targets/fuzz-url.rs"
24+
2125
[workspace]
2226
members = ["."]

url/fuzz/fuzz_targets/fuzz-url.rs

+129
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
#![no_main]
2+
#[macro_use]
3+
extern crate libfuzzer_sys;
4+
extern crate url;
5+
6+
use std::str;
7+
use url::{Url, quirks, Origin, Host, Position};
8+
9+
fuzz_target!(|data: &[u8]| {
10+
// Initialisation
11+
let utf8 = match str::from_utf8(data) {
12+
Ok(v) => v,
13+
Err(_) => return,
14+
};
15+
let mut url_parse_attempt = Url::parse(utf8);
16+
17+
// Randomly fuzz functions
18+
match data.get(0) {
19+
Some(&choice) => match choice % 20 {
20+
0 => {
21+
if let Ok(parsed_url) = &url_parse_attempt {
22+
let _ = parsed_url.query();
23+
}
24+
},
25+
1 => {
26+
if let Ok(parsed_url) = &url_parse_attempt {
27+
let _ = parsed_url.fragment();
28+
}
29+
},
30+
2 => {
31+
if let Ok(parsed_url) = &mut url_parse_attempt {
32+
let _ = quirks::set_protocol(parsed_url, utf8);
33+
}
34+
},
35+
3 => {
36+
if let Ok(parsed_url) = &mut url_parse_attempt {
37+
let _ = quirks::set_username(parsed_url, utf8);
38+
}
39+
},
40+
4 => {
41+
if let Ok(parsed_url) = &mut url_parse_attempt {
42+
let _ = quirks::set_password(parsed_url, utf8);
43+
}
44+
},
45+
5 => {
46+
if let Ok(parsed_url) = &mut url_parse_attempt {
47+
quirks::set_search(parsed_url, utf8);
48+
}
49+
},
50+
6 => {
51+
if let Ok(parsed_url) = &mut url_parse_attempt {
52+
quirks::set_hash(parsed_url, utf8);
53+
}
54+
},
55+
7 => {
56+
if let Ok(parsed_url) = &mut url_parse_attempt {
57+
parsed_url.set_scheme("https").ok();
58+
}
59+
},
60+
8 => {
61+
if let Ok(parsed_url) = &mut url_parse_attempt {
62+
let _ = parsed_url.set_host(Some("example.com"));
63+
}
64+
},
65+
9 => {
66+
if let Ok(parsed_url) = &mut url_parse_attempt {
67+
let _ = parsed_url.set_port(Some(8080));
68+
}
69+
},
70+
10 => {
71+
if let Ok(parsed_url) = &mut url_parse_attempt {
72+
let _ = parsed_url.set_path("/test/path");
73+
}
74+
},
75+
11 => {
76+
if let Ok(parsed_url) = &mut url_parse_attempt {
77+
let _ = parsed_url.path_segments_mut().map(|mut segments| {
78+
segments.push("segment1");
79+
segments.push("segment2");
80+
});
81+
}
82+
},
83+
12 => {
84+
if let Ok(parsed_url) = &mut url_parse_attempt {
85+
let _ = parsed_url.set_query(Some("key=value"));
86+
}
87+
},
88+
13 => {
89+
if let Ok(parsed_url) = &mut url_parse_attempt {
90+
let _ = parsed_url.set_fragment(Some("fragment"));
91+
}
92+
},
93+
14 => {
94+
if let Ok(parsed_url) = &url_parse_attempt {
95+
if let Some(domain) = parsed_url.host_str() {
96+
let _ = Host::parse(domain);
97+
}
98+
}
99+
},
100+
15 => {
101+
if let Ok(parsed_url) = &url_parse_attempt {
102+
let _ = parsed_url.origin().ascii_serialization();
103+
}
104+
},
105+
16 => {
106+
if let Ok(parsed_url) = &mut url_parse_attempt {
107+
let _ = parsed_url.join("/relative/path");
108+
}
109+
},
110+
17 => {
111+
if let Ok(parsed_url) = &mut url_parse_attempt {
112+
let _ = parsed_url.make_relative(&Url::parse("https://example.com/base").unwrap());
113+
}
114+
},
115+
18 => {
116+
if let Ok(parsed_url) = &url_parse_attempt {
117+
let _ = &parsed_url[Position::BeforeHost..Position::AfterPort];
118+
}
119+
},
120+
19 => {
121+
if let Ok(parsed_url) = &url_parse_attempt {
122+
let _ = &parsed_url[Position::BeforeScheme..];
123+
}
124+
},
125+
_ => {},
126+
},
127+
None => {},
128+
}
129+
});

0 commit comments

Comments
 (0)