/src/quick-xml/fuzz/fuzz_targets/fuzz_target_1.rs
Line | Count | Source (jump to first uncovered line) |
1 | | #![no_main] |
2 | | use libfuzzer_sys::fuzz_target; |
3 | | use std::hint::black_box; |
4 | | |
5 | | use quick_xml::{events::Event, reader::Reader, writer::Writer}; |
6 | | use std::io::Cursor; |
7 | | |
8 | | macro_rules! debug_format { |
9 | | ($x:expr) => { |
10 | | let _unused = std::hint::black_box(format!("{:?}", $x)); |
11 | | }; |
12 | | } |
13 | | |
14 | 10.3k | fn round_trip<R>(reader: &mut Reader<R>) -> () |
15 | 10.3k | where |
16 | 10.3k | R: std::io::BufRead, |
17 | 10.3k | { |
18 | 10.3k | let mut writer = Writer::new(Cursor::new(Vec::new())); |
19 | 10.3k | let mut buf = vec![]; |
20 | 10.3k | let config = reader.config_mut(); |
21 | 10.3k | config.expand_empty_elements = true; |
22 | 10.3k | config.trim_text(true); |
23 | | loop { |
24 | 4.19M | let event_result = reader.read_event_into(&mut buf); |
25 | 4.19M | if let Ok(ref event) = event_result { |
26 | 4.18M | let _event = black_box(event.borrow()); |
27 | 4.18M | let _event = black_box(event.as_ref()); |
28 | 4.18M | debug_format!(event); |
29 | 4.18M | debug_format!(writer.write_event(event.borrow())); |
30 | 4.18M | } |
31 | 4.18M | match event_result { |
32 | 3.11M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { |
33 | 3.11M | debug_format!(e); |
34 | 3.11M | debug_format!(e.name()); |
35 | 3.11M | for a in e.attributes() { |
36 | 540k | debug_format!(a); |
37 | 540k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>::{closure#0} Line | Count | Source | 37 | 157k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { |
fuzz_target_1::round_trip::<&[u8]>::{closure#0} Line | Count | Source | 37 | 68.6k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { |
|
38 | 9.39k | break; |
39 | 530k | } |
40 | | } |
41 | | } |
42 | 321k | Ok(Event::Text(ref e)) |
43 | 1.80k | | Ok(Event::Comment(ref e)) |
44 | 1.58k | | Ok(Event::DocType(ref e)) => { |
45 | 325k | debug_format!(e); |
46 | 325k | if let Err(err) = e.decode() { |
47 | 505 | debug_format!(err); |
48 | 505 | break; |
49 | 324k | } |
50 | | } |
51 | 100k | Ok(Event::CData(e)) => { |
52 | 100k | if let Err(err) = e.escape() { |
53 | 45 | let _displayed = black_box(format!("{}", err)); |
54 | 45 | debug_format!(err); |
55 | 45 | break; |
56 | 100k | } |
57 | | } |
58 | 168k | Ok(Event::GeneralRef(ref e)) => { |
59 | 168k | debug_format!(e); |
60 | 168k | debug_format!(e.is_char_ref()); |
61 | 168k | debug_format!(e.resolve_char_ref()); |
62 | 168k | } |
63 | 5.06k | Ok(Event::PI(ref e)) => { |
64 | 5.06k | debug_format!(e); |
65 | 5.06k | } |
66 | 6.61k | Ok(Event::Decl(ref e)) => { |
67 | 6.61k | debug_format!(e); |
68 | 6.61k | let _ = black_box(e.version()); |
69 | 6.61k | let _ = black_box(e.encoding()); |
70 | 6.61k | let _ = black_box(e.standalone()); |
71 | 6.61k | } |
72 | 457k | Ok(Event::End(e)) => { |
73 | 457k | debug_format!(e.local_name()); |
74 | 457k | let name = e.name(); |
75 | 457k | debug_format!(name); |
76 | 457k | debug_format!(name.prefix()); |
77 | 457k | debug_format!(name.local_name()); |
78 | 457k | debug_format!(name.decompose()); |
79 | 457k | debug_format!(name.as_namespace_binding()); |
80 | 457k | debug_format!(e); |
81 | 457k | } |
82 | 3.42k | Err(e) => { |
83 | 3.42k | debug_format!(e); |
84 | 3.42k | break; |
85 | | } |
86 | 6.38k | Ok(Event::Eof) => break, |
87 | | } |
88 | 4.18M | buf.clear(); |
89 | | } |
90 | 10.3k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); |
91 | 10.3k | } fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>> Line | Count | Source | 14 | 6.35k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 6.35k | where | 16 | 6.35k | R: std::io::BufRead, | 17 | 6.35k | { | 18 | 6.35k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 19 | 6.35k | let mut buf = vec![]; | 20 | 6.35k | let config = reader.config_mut(); | 21 | 6.35k | config.expand_empty_elements = true; | 22 | 6.35k | config.trim_text(true); | 23 | | loop { | 24 | 2.99M | let event_result = reader.read_event_into(&mut buf); | 25 | 2.99M | if let Ok(ref event) = event_result { | 26 | 2.99M | let _event = black_box(event.borrow()); | 27 | 2.99M | let _event = black_box(event.as_ref()); | 28 | 2.99M | debug_format!(event); | 29 | 2.99M | debug_format!(writer.write_event(event.borrow())); | 30 | 2.99M | } | 31 | 2.99M | match event_result { | 32 | 2.26M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 33 | 2.26M | debug_format!(e); | 34 | 2.26M | debug_format!(e.name()); | 35 | 2.26M | for a in e.attributes() { | 36 | 399k | debug_format!(a); | 37 | 399k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { | 38 | 5.04k | break; | 39 | 394k | } | 40 | | } | 41 | | } | 42 | 211k | Ok(Event::Text(ref e)) | 43 | 975 | | Ok(Event::Comment(ref e)) | 44 | 818 | | Ok(Event::DocType(ref e)) => { | 45 | 213k | debug_format!(e); | 46 | 213k | if let Err(err) = e.decode() { | 47 | 505 | debug_format!(err); | 48 | 505 | break; | 49 | 212k | } | 50 | | } | 51 | 53.4k | Ok(Event::CData(e)) => { | 52 | 53.4k | if let Err(err) = e.escape() { | 53 | 45 | let _displayed = black_box(format!("{}", err)); | 54 | 45 | debug_format!(err); | 55 | 45 | break; | 56 | 53.4k | } | 57 | | } | 58 | 92.9k | Ok(Event::GeneralRef(ref e)) => { | 59 | 92.9k | debug_format!(e); | 60 | 92.9k | debug_format!(e.is_char_ref()); | 61 | 92.9k | debug_format!(e.resolve_char_ref()); | 62 | 92.9k | } | 63 | 3.12k | Ok(Event::PI(ref e)) => { | 64 | 3.12k | debug_format!(e); | 65 | 3.12k | } | 66 | 3.72k | Ok(Event::Decl(ref e)) => { | 67 | 3.72k | debug_format!(e); | 68 | 3.72k | let _ = black_box(e.version()); | 69 | 3.72k | let _ = black_box(e.encoding()); | 70 | 3.72k | let _ = black_box(e.standalone()); | 71 | 3.72k | } | 72 | 357k | Ok(Event::End(e)) => { | 73 | 357k | debug_format!(e.local_name()); | 74 | 357k | let name = e.name(); | 75 | 357k | debug_format!(name); | 76 | 357k | debug_format!(name.prefix()); | 77 | 357k | debug_format!(name.local_name()); | 78 | 357k | debug_format!(name.decompose()); | 79 | 357k | debug_format!(name.as_namespace_binding()); | 80 | 357k | debug_format!(e); | 81 | 357k | } | 82 | 2.08k | Err(e) => { | 83 | 2.08k | debug_format!(e); | 84 | 2.08k | break; | 85 | | } | 86 | 3.72k | Ok(Event::Eof) => break, | 87 | | } | 88 | 2.98M | buf.clear(); | 89 | | } | 90 | 6.35k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 91 | 6.35k | } |
fuzz_target_1::round_trip::<&[u8]> Line | Count | Source | 14 | 4.00k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 4.00k | where | 16 | 4.00k | R: std::io::BufRead, | 17 | 4.00k | { | 18 | 4.00k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 19 | 4.00k | let mut buf = vec![]; | 20 | 4.00k | let config = reader.config_mut(); | 21 | 4.00k | config.expand_empty_elements = true; | 22 | 4.00k | config.trim_text(true); | 23 | | loop { | 24 | 1.19M | let event_result = reader.read_event_into(&mut buf); | 25 | 1.19M | if let Ok(ref event) = event_result { | 26 | 1.19M | let _event = black_box(event.borrow()); | 27 | 1.19M | let _event = black_box(event.as_ref()); | 28 | 1.19M | debug_format!(event); | 29 | 1.19M | debug_format!(writer.write_event(event.borrow())); | 30 | 1.19M | } | 31 | 1.19M | match event_result { | 32 | 853k | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 33 | 853k | debug_format!(e); | 34 | 853k | debug_format!(e.name()); | 35 | 853k | for a in e.attributes() { | 36 | 140k | debug_format!(a); | 37 | 140k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { | 38 | 4.35k | break; | 39 | 136k | } | 40 | | } | 41 | | } | 42 | 110k | Ok(Event::Text(ref e)) | 43 | 828 | | Ok(Event::Comment(ref e)) | 44 | 769 | | Ok(Event::DocType(ref e)) => { | 45 | 111k | debug_format!(e); | 46 | 111k | if let Err(err) = e.decode() { | 47 | 0 | debug_format!(err); | 48 | 0 | break; | 49 | 111k | } | 50 | | } | 51 | 46.7k | Ok(Event::CData(e)) => { | 52 | 46.7k | if let Err(err) = e.escape() { | 53 | 0 | let _displayed = black_box(format!("{}", err)); | 54 | 0 | debug_format!(err); | 55 | 0 | break; | 56 | 46.7k | } | 57 | | } | 58 | 75.1k | Ok(Event::GeneralRef(ref e)) => { | 59 | 75.1k | debug_format!(e); | 60 | 75.1k | debug_format!(e.is_char_ref()); | 61 | 75.1k | debug_format!(e.resolve_char_ref()); | 62 | 75.1k | } | 63 | 1.94k | Ok(Event::PI(ref e)) => { | 64 | 1.94k | debug_format!(e); | 65 | 1.94k | } | 66 | 2.88k | Ok(Event::Decl(ref e)) => { | 67 | 2.88k | debug_format!(e); | 68 | 2.88k | let _ = black_box(e.version()); | 69 | 2.88k | let _ = black_box(e.encoding()); | 70 | 2.88k | let _ = black_box(e.standalone()); | 71 | 2.88k | } | 72 | 99.4k | Ok(Event::End(e)) => { | 73 | 99.4k | debug_format!(e.local_name()); | 74 | 99.4k | let name = e.name(); | 75 | 99.4k | debug_format!(name); | 76 | 99.4k | debug_format!(name.prefix()); | 77 | 99.4k | debug_format!(name.local_name()); | 78 | 99.4k | debug_format!(name.decompose()); | 79 | 99.4k | debug_format!(name.as_namespace_binding()); | 80 | 99.4k | debug_format!(e); | 81 | 99.4k | } | 82 | 1.34k | Err(e) => { | 83 | 1.34k | debug_format!(e); | 84 | 1.34k | break; | 85 | | } | 86 | 2.66k | Ok(Event::Eof) => break, | 87 | | } | 88 | 1.19M | buf.clear(); | 89 | | } | 90 | 4.00k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 91 | 4.00k | } |
|
92 | | |
93 | | fuzz_target!(|data: &[u8]| { |
94 | | // From reader |
95 | | let cursor = Cursor::new(data); |
96 | | let mut reader = Reader::from_reader(cursor); |
97 | | _ = std::hint::black_box(round_trip(&mut reader)); |
98 | | |
99 | | // From str |
100 | | if let Ok(s) = std::str::from_utf8(data) { |
101 | | let mut reader = Reader::from_str(s); |
102 | | _ = std::hint::black_box(round_trip(&mut reader)); |
103 | | } |
104 | | }); |