/src/rust-url/url/fuzz/fuzz_targets/fuzz-url.rs
Line | Count | Source |
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 | 273 | let _ = parsed_url.path_segments_mut().map(|mut segments| { |
78 | 273 | segments.push("segment1"); |
79 | 273 | segments.push("segment2"); |
80 | 273 | }); |
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 | | }); |