Skip to content

Commit c733050

Browse files
committed
Add arbitrary_url fuzz target
I moved some of the logic from the existing `decode_url` target into this one to utilize the fuzzer to test different inputs
1 parent fbb0d35 commit c733050

3 files changed

Lines changed: 49 additions & 18 deletions

File tree

fuzz/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,9 @@ name = "url_decode_url"
3737
path = "fuzz_targets/url/decode_url.rs"
3838
doc = false
3939
bench = false
40+
41+
[[bin]]
42+
name = "url_arbitrary_url"
43+
path = "fuzz_targets/url/arbitrary_url.rs"
44+
doc = false
45+
bench = false
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#![no_main]
2+
3+
use arbitrary::{Arbitrary, Unstructured};
4+
use libfuzzer_sys::fuzz_target;
5+
use payjoin::Url;
6+
7+
fn do_test(data: &[u8]) {
8+
let mut u = Unstructured::new(data);
9+
if let Ok(mut url) = Url::arbitrary(&mut u) {
10+
if let Ok(port) = u.arbitrary::<Option<u16>>() {
11+
url.set_port(port);
12+
}
13+
if let Ok(fragment) = u.arbitrary::<Option<&str>>() {
14+
url.set_fragment(fragment);
15+
}
16+
if let Ok((key, value)) = u.arbitrary::<(&str, &str)>() {
17+
url.query_pairs_mut().append_pair(key, value);
18+
url.clear_query();
19+
}
20+
if let Some(mut segs) = url.path_segments_mut() {
21+
if let Ok(segment) = u.arbitrary::<&str>() {
22+
segs.push(segment);
23+
}
24+
}
25+
if let Ok(segment) = String::arbitrary(&mut u) {
26+
let _ = url.join(&segment);
27+
}
28+
}
29+
}
30+
31+
fuzz_target!(|data| {
32+
do_test(data);
33+
});
34+
35+
#[cfg(test)]
36+
mod tests {
37+
#[test]
38+
fn duplicate_crash() {
39+
let data = b"\x00";
40+
super::do_test(&data[..]);
41+
}
42+
}

fuzz/fuzz_targets/url/decode_url.rs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use payjoin::Url;
99
fn do_test(data: &[u8]) {
1010
let Ok(s) = str::from_utf8(data) else { return };
1111

12-
let Ok(mut url) = Url::parse(s) else { return };
12+
let Ok(url) = Url::parse(s) else { return };
1313

1414
let _ = url.scheme();
1515
let _ = url.domain();
@@ -44,23 +44,6 @@ fn do_test(data: &[u8]) {
4444
reparsed.as_str()
4545
);
4646
}
47-
48-
url.set_port(Some(8080));
49-
url.set_port(None);
50-
url.set_fragment(Some("fuzz"));
51-
url.set_fragment(None);
52-
url.query_pairs_mut().append_pair("k", "v");
53-
url.clear_query();
54-
url.query_pairs_mut().append_pair("fuzz_key", "fuzz_val");
55-
56-
if let Some(mut segs) = url.path_segments_mut() {
57-
segs.push("fuzz_segment");
58-
}
59-
60-
let _ = url.join("relative/path");
61-
let _ = url.join("/absolute/path");
62-
let _ = url.join("../dotdot");
63-
let _ = url.join("https://other.example.com/new");
6447
}
6548

6649
fuzz_target!(|data| {

0 commit comments

Comments
 (0)