/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 | 11.2k | fn round_trip<R>(reader: &mut Reader<R>) -> () |
15 | 11.2k | where |
16 | 11.2k | R: std::io::BufRead, |
17 | 11.2k | { |
18 | 11.2k | let mut writer = Writer::new(Cursor::new(Vec::new())); |
19 | 11.2k | let mut buf = vec![]; |
20 | 11.2k | let config = reader.config_mut(); |
21 | 11.2k | config.expand_empty_elements = true; |
22 | 11.2k | config.trim_text(true); |
23 | | loop { |
24 | 3.96M | let event_result = reader.read_event_into(&mut buf); |
25 | 3.96M | if let Ok(ref event) = event_result { |
26 | 3.96M | let _event = black_box(event.borrow()); |
27 | 3.96M | let _event = black_box(event.as_ref()); |
28 | 3.96M | debug_format!(event); |
29 | 3.96M | debug_format!(writer.write_event(event.borrow())); |
30 | 3.96M | } |
31 | 3.96M | match event_result { |
32 | 3.14M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { |
33 | 3.14M | debug_format!(e); |
34 | 3.14M | debug_format!(e.name()); |
35 | 3.14M | for a in e.attributes() { |
36 | 885k | debug_format!(a); |
37 | 885k | 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 | 248k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { |
fuzz_target_1::round_trip::<&[u8]>::{closure#0} Line | Count | Source | 37 | 146k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { |
|
38 | 6.60k | break; |
39 | 879k | } |
40 | | } |
41 | | } |
42 | 178k | Ok(Event::Text(ref e)) |
43 | 1.48k | | Ok(Event::Comment(ref e)) |
44 | 1.57k | | Ok(Event::DocType(ref e)) => { |
45 | 181k | debug_format!(e); |
46 | 181k | if let Err(err) = e.decode() { |
47 | 546 | debug_format!(err); |
48 | 546 | break; |
49 | 180k | } |
50 | | } |
51 | 62.7k | Ok(Event::CData(e)) => { |
52 | 62.7k | if let Err(err) = e.escape() { |
53 | 54 | let _displayed = black_box(format!("{}", err)); |
54 | 54 | debug_format!(err); |
55 | 54 | break; |
56 | 62.7k | } |
57 | | } |
58 | 71.2k | Ok(Event::GeneralRef(ref e)) => { |
59 | 71.2k | debug_format!(e); |
60 | 71.2k | debug_format!(e.is_char_ref()); |
61 | 71.2k | debug_format!(e.resolve_char_ref()); |
62 | 71.2k | } |
63 | 3.53k | Ok(Event::PI(ref e)) => { |
64 | 3.53k | debug_format!(e); |
65 | 3.53k | } |
66 | 9.56k | Ok(Event::Decl(ref e)) => { |
67 | 9.56k | debug_format!(e); |
68 | 9.56k | let _ = black_box(e.version()); |
69 | 9.56k | let _ = black_box(e.encoding()); |
70 | 9.56k | let _ = black_box(e.standalone()); |
71 | 9.56k | } |
72 | 477k | Ok(Event::End(e)) => { |
73 | 477k | debug_format!(e.local_name()); |
74 | 477k | let name = e.name(); |
75 | 477k | debug_format!(name); |
76 | 477k | debug_format!(name.prefix()); |
77 | 477k | debug_format!(name.local_name()); |
78 | 477k | debug_format!(name.decompose()); |
79 | 477k | debug_format!(name.as_namespace_binding()); |
80 | 477k | debug_format!(e); |
81 | 477k | } |
82 | 3.50k | Err(e) => { |
83 | 3.50k | debug_format!(e); |
84 | 3.50k | break; |
85 | | } |
86 | 7.18k | Ok(Event::Eof) => break, |
87 | | } |
88 | 3.95M | buf.clear(); |
89 | | } |
90 | 11.2k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); |
91 | 11.2k | } fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>> Line | Count | Source | 14 | 6.88k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 6.88k | where | 16 | 6.88k | R: std::io::BufRead, | 17 | 6.88k | { | 18 | 6.88k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 19 | 6.88k | let mut buf = vec![]; | 20 | 6.88k | let config = reader.config_mut(); | 21 | 6.88k | config.expand_empty_elements = true; | 22 | 6.88k | config.trim_text(true); | 23 | | loop { | 24 | 2.88M | let event_result = reader.read_event_into(&mut buf); | 25 | 2.88M | if let Ok(ref event) = event_result { | 26 | 2.88M | let _event = black_box(event.borrow()); | 27 | 2.88M | let _event = black_box(event.as_ref()); | 28 | 2.88M | debug_format!(event); | 29 | 2.88M | debug_format!(writer.write_event(event.borrow())); | 30 | 2.88M | } | 31 | 2.88M | match event_result { | 32 | 2.34M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 33 | 2.34M | debug_format!(e); | 34 | 2.34M | debug_format!(e.name()); | 35 | 2.34M | for a in e.attributes() { | 36 | 614k | debug_format!(a); | 37 | 614k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { | 38 | 3.61k | break; | 39 | 611k | } | 40 | | } | 41 | | } | 42 | 108k | Ok(Event::Text(ref e)) | 43 | 770 | | Ok(Event::Comment(ref e)) | 44 | 820 | | Ok(Event::DocType(ref e)) => { | 45 | 109k | debug_format!(e); | 46 | 109k | if let Err(err) = e.decode() { | 47 | 546 | debug_format!(err); | 48 | 546 | break; | 49 | 109k | } | 50 | | } | 51 | 32.3k | Ok(Event::CData(e)) => { | 52 | 32.3k | if let Err(err) = e.escape() { | 53 | 54 | let _displayed = black_box(format!("{}", err)); | 54 | 54 | debug_format!(err); | 55 | 54 | break; | 56 | 32.2k | } | 57 | | } | 58 | 42.7k | Ok(Event::GeneralRef(ref e)) => { | 59 | 42.7k | debug_format!(e); | 60 | 42.7k | debug_format!(e.is_char_ref()); | 61 | 42.7k | debug_format!(e.resolve_char_ref()); | 62 | 42.7k | } | 63 | 1.97k | Ok(Event::PI(ref e)) => { | 64 | 1.97k | debug_format!(e); | 65 | 1.97k | } | 66 | 6.22k | Ok(Event::Decl(ref e)) => { | 67 | 6.22k | debug_format!(e); | 68 | 6.22k | let _ = black_box(e.version()); | 69 | 6.22k | let _ = black_box(e.encoding()); | 70 | 6.22k | let _ = black_box(e.standalone()); | 71 | 6.22k | } | 72 | 335k | Ok(Event::End(e)) => { | 73 | 335k | debug_format!(e.local_name()); | 74 | 335k | let name = e.name(); | 75 | 335k | debug_format!(name); | 76 | 335k | debug_format!(name.prefix()); | 77 | 335k | debug_format!(name.local_name()); | 78 | 335k | debug_format!(name.decompose()); | 79 | 335k | debug_format!(name.as_namespace_binding()); | 80 | 335k | debug_format!(e); | 81 | 335k | } | 82 | 2.11k | Err(e) => { | 83 | 2.11k | debug_format!(e); | 84 | 2.11k | break; | 85 | | } | 86 | 4.16k | Ok(Event::Eof) => break, | 87 | | } | 88 | 2.87M | buf.clear(); | 89 | | } | 90 | 6.88k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 91 | 6.88k | } |
fuzz_target_1::round_trip::<&[u8]> Line | Count | Source | 14 | 4.41k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 4.41k | where | 16 | 4.41k | R: std::io::BufRead, | 17 | 4.41k | { | 18 | 4.41k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 19 | 4.41k | let mut buf = vec![]; | 20 | 4.41k | let config = reader.config_mut(); | 21 | 4.41k | config.expand_empty_elements = true; | 22 | 4.41k | config.trim_text(true); | 23 | | loop { | 24 | 1.08M | let event_result = reader.read_event_into(&mut buf); | 25 | 1.08M | if let Ok(ref event) = event_result { | 26 | 1.08M | let _event = black_box(event.borrow()); | 27 | 1.08M | let _event = black_box(event.as_ref()); | 28 | 1.08M | debug_format!(event); | 29 | 1.08M | debug_format!(writer.write_event(event.borrow())); | 30 | 1.08M | } | 31 | 1.08M | match event_result { | 32 | 799k | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 33 | 799k | debug_format!(e); | 34 | 799k | debug_format!(e.name()); | 35 | 799k | for a in e.attributes() { | 36 | 271k | debug_format!(a); | 37 | 271k | if a.ok().map_or(false, |a| a.unescape_value().is_err()) { | 38 | 2.99k | break; | 39 | 268k | } | 40 | | } | 41 | | } | 42 | 70.1k | Ok(Event::Text(ref e)) | 43 | 717 | | Ok(Event::Comment(ref e)) | 44 | 757 | | Ok(Event::DocType(ref e)) => { | 45 | 71.6k | debug_format!(e); | 46 | 71.6k | if let Err(err) = e.decode() { | 47 | 0 | debug_format!(err); | 48 | 0 | break; | 49 | 71.6k | } | 50 | | } | 51 | 30.4k | Ok(Event::CData(e)) => { | 52 | 30.4k | if let Err(err) = e.escape() { | 53 | 0 | let _displayed = black_box(format!("{}", err)); | 54 | 0 | debug_format!(err); | 55 | 0 | break; | 56 | 30.4k | } | 57 | | } | 58 | 28.5k | Ok(Event::GeneralRef(ref e)) => { | 59 | 28.5k | debug_format!(e); | 60 | 28.5k | debug_format!(e.is_char_ref()); | 61 | 28.5k | debug_format!(e.resolve_char_ref()); | 62 | 28.5k | } | 63 | 1.55k | Ok(Event::PI(ref e)) => { | 64 | 1.55k | debug_format!(e); | 65 | 1.55k | } | 66 | 3.33k | Ok(Event::Decl(ref e)) => { | 67 | 3.33k | debug_format!(e); | 68 | 3.33k | let _ = black_box(e.version()); | 69 | 3.33k | let _ = black_box(e.encoding()); | 70 | 3.33k | let _ = black_box(e.standalone()); | 71 | 3.33k | } | 72 | 142k | Ok(Event::End(e)) => { | 73 | 142k | debug_format!(e.local_name()); | 74 | 142k | let name = e.name(); | 75 | 142k | debug_format!(name); | 76 | 142k | debug_format!(name.prefix()); | 77 | 142k | debug_format!(name.local_name()); | 78 | 142k | debug_format!(name.decompose()); | 79 | 142k | debug_format!(name.as_namespace_binding()); | 80 | 142k | debug_format!(e); | 81 | 142k | } | 82 | 1.38k | Err(e) => { | 83 | 1.38k | debug_format!(e); | 84 | 1.38k | break; | 85 | | } | 86 | 3.02k | Ok(Event::Eof) => break, | 87 | | } | 88 | 1.07M | buf.clear(); | 89 | | } | 90 | 4.41k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 91 | 4.41k | } |
|
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 | | }); |