| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #![no_main]
- #[macro_use]
- extern crate libfuzzer_sys;
- extern crate url;
- use std::str;
- use url::{Url, quirks, Origin, Host, Position};
- fuzz_target!(|data: &[u8]| {
- // Initialisation
- let utf8 = match str::from_utf8(data) {
- Ok(v) => v,
- Err(_) => return,
- };
- let mut url_parse_attempt = Url::parse(utf8);
- // Randomly fuzz functions
- match data.get(0) {
- Some(&choice) => match choice % 20 {
- 0 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- let _ = parsed_url.query();
- }
- },
- 1 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- let _ = parsed_url.fragment();
- }
- },
- 2 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = quirks::set_protocol(parsed_url, utf8);
- }
- },
- 3 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = quirks::set_username(parsed_url, utf8);
- }
- },
- 4 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = quirks::set_password(parsed_url, utf8);
- }
- },
- 5 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- quirks::set_search(parsed_url, utf8);
- }
- },
- 6 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- quirks::set_hash(parsed_url, utf8);
- }
- },
- 7 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- parsed_url.set_scheme("https").ok();
- }
- },
- 8 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.set_host(Some("example.com"));
- }
- },
- 9 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.set_port(Some(8080));
- }
- },
- 10 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.set_path("/test/path");
- }
- },
- 11 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.path_segments_mut().map(|mut segments| {
- segments.push("segment1");
- segments.push("segment2");
- });
- }
- },
- 12 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.set_query(Some("key=value"));
- }
- },
- 13 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.set_fragment(Some("fragment"));
- }
- },
- 14 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- if let Some(domain) = parsed_url.host_str() {
- let _ = Host::parse(domain);
- }
- }
- },
- 15 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- let _ = parsed_url.origin().ascii_serialization();
- }
- },
- 16 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.join("/relative/path");
- }
- },
- 17 => {
- if let Ok(parsed_url) = &mut url_parse_attempt {
- let _ = parsed_url.make_relative(&Url::parse("https://example.com/base").unwrap());
- }
- },
- 18 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- let _ = &parsed_url[Position::BeforeHost..Position::AfterPort];
- }
- },
- 19 => {
- if let Ok(parsed_url) = &url_parse_attempt {
- let _ = &parsed_url[Position::BeforeScheme..];
- }
- },
- _ => {},
- },
- None => {},
- }
- });
|