Coverage Report

Created: 2025-05-08 06:13

/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
});