File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -37,3 +37,9 @@ name = "url_decode_url"
3737path = " fuzz_targets/url/decode_url.rs"
3838doc = false
3939bench = false
40+
41+ [[bin ]]
42+ name = " arbitrary_url"
43+ path = " fuzz_targets/url/arbitrary_url.rs"
44+ doc = false
45+ bench = false
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change @@ -9,7 +9,7 @@ use payjoin::Url;
99fn 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
6649fuzz_target ! ( |data| {
You can’t perform that action at this time.
0 commit comments