/src/quick-xml/fuzz/fuzz_targets/fuzz_target_1.rs
Line | Count | Source |
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, XmlVersion}; |
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 | 17.7k | fn round_trip<R>(reader: &mut Reader<R>) -> () |
15 | 17.7k | where |
16 | 17.7k | R: std::io::BufRead, |
17 | | { |
18 | 17.7k | let mut version = XmlVersion::Implicit1_0; |
19 | 17.7k | let mut writer = Writer::new(Cursor::new(Vec::new())); |
20 | 17.7k | let mut buf = vec![]; |
21 | 17.7k | let config = reader.config_mut(); |
22 | 17.7k | config.expand_empty_elements = true; |
23 | 17.7k | config.trim_text(true); |
24 | | loop { |
25 | 14.0M | let event_result = reader.read_event_into(&mut buf); |
26 | 14.0M | if let Ok(ref event) = event_result { |
27 | 14.0M | let _event = black_box(event.borrow()); |
28 | 14.0M | let _event = black_box(event.as_ref()); |
29 | 14.0M | debug_format!(event); |
30 | 14.0M | debug_format!(writer.write_event(event.borrow())); |
31 | 14.0M | } |
32 | 14.0M | match event_result { |
33 | 11.3M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { |
34 | 11.3M | debug_format!(e); |
35 | 11.3M | debug_format!(e.name()); |
36 | 11.3M | for a in e.attributes() { |
37 | 1.71M | debug_format!(a); |
38 | 1.71M | if a.ok() |
39 | 1.71M | .map_or(false, |a| a.normalized_value(version).is_err()) fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>>::{closure#0}Line | Count | Source | 39 | 366k | .map_or(false, |a| a.normalized_value(version).is_err()) |
fuzz_target_1::round_trip::<&[u8]>::{closure#0}Line | Count | Source | 39 | 113k | .map_or(false, |a| a.normalized_value(version).is_err()) |
|
40 | | { |
41 | 9.28k | break; |
42 | 1.70M | } |
43 | | } |
44 | | } |
45 | 436k | Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => { |
46 | 436k | debug_format!(e); |
47 | 436k | } |
48 | 121k | Ok(Event::CData(e)) => { |
49 | 121k | if let Err(err) = e.escape() { |
50 | 0 | let _displayed = black_box(format!("{}", err)); |
51 | 0 | debug_format!(err); |
52 | 0 | break; |
53 | 121k | } |
54 | | } |
55 | 74.8k | Ok(Event::GeneralRef(ref e)) => { |
56 | 74.8k | debug_format!(e); |
57 | 74.8k | debug_format!(e.is_char_ref()); |
58 | 74.8k | debug_format!(e.resolve_char_ref()); |
59 | 74.8k | } |
60 | 6.04k | Ok(Event::PI(ref e)) => { |
61 | 6.04k | debug_format!(e); |
62 | 6.04k | } |
63 | 7.63k | Ok(Event::Decl(ref e)) => { |
64 | 7.63k | debug_format!(e); |
65 | 7.63k | let _ = black_box(e.version()); |
66 | 7.63k | let _ = black_box(e.encoding()); |
67 | 7.63k | let _ = black_box(e.standalone()); |
68 | 7.63k | match e.xml_version() { |
69 | 6.67k | Ok(v) => version = v, |
70 | 962 | Err(_) => break, |
71 | | } |
72 | | } |
73 | 1.99M | Ok(Event::End(e)) => { |
74 | 1.99M | debug_format!(e.local_name()); |
75 | 1.99M | let name = e.name(); |
76 | 1.99M | debug_format!(name); |
77 | 1.99M | debug_format!(name.prefix()); |
78 | 1.99M | debug_format!(name.local_name()); |
79 | 1.99M | debug_format!(name.decompose()); |
80 | 1.99M | debug_format!(name.as_namespace_binding()); |
81 | 1.99M | debug_format!(e); |
82 | 1.99M | } |
83 | 7.13k | Err(e) => { |
84 | 7.13k | debug_format!(e); |
85 | 7.13k | break; |
86 | | } |
87 | 9.65k | Ok(Event::Eof) => break, |
88 | | } |
89 | 14.0M | buf.clear(); |
90 | | } |
91 | 17.7k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); |
92 | 17.7k | } fuzz_target_1::round_trip::<std::io::cursor::Cursor<&[u8]>> Line | Count | Source | 14 | 9.96k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 9.96k | where | 16 | 9.96k | R: std::io::BufRead, | 17 | | { | 18 | 9.96k | let mut version = XmlVersion::Implicit1_0; | 19 | 9.96k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 20 | 9.96k | let mut buf = vec![]; | 21 | 9.96k | let config = reader.config_mut(); | 22 | 9.96k | config.expand_empty_elements = true; | 23 | 9.96k | config.trim_text(true); | 24 | | loop { | 25 | 8.44M | let event_result = reader.read_event_into(&mut buf); | 26 | 8.44M | if let Ok(ref event) = event_result { | 27 | 8.44M | let _event = black_box(event.borrow()); | 28 | 8.44M | let _event = black_box(event.as_ref()); | 29 | 8.44M | debug_format!(event); | 30 | 8.44M | debug_format!(writer.write_event(event.borrow())); | 31 | 8.44M | } | 32 | 8.44M | match event_result { | 33 | 6.84M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 34 | 6.84M | debug_format!(e); | 35 | 6.84M | debug_format!(e.name()); | 36 | 6.84M | for a in e.attributes() { | 37 | 1.31M | debug_format!(a); | 38 | 1.31M | if a.ok() | 39 | 1.31M | .map_or(false, |a| a.normalized_value(version).is_err()) | 40 | | { | 41 | 5.07k | break; | 42 | 1.31M | } | 43 | | } | 44 | | } | 45 | 264k | Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => { | 46 | 264k | debug_format!(e); | 47 | 264k | } | 48 | 80.6k | Ok(Event::CData(e)) => { | 49 | 80.6k | if let Err(err) = e.escape() { | 50 | 0 | let _displayed = black_box(format!("{}", err)); | 51 | 0 | debug_format!(err); | 52 | 0 | break; | 53 | 80.6k | } | 54 | | } | 55 | 39.4k | Ok(Event::GeneralRef(ref e)) => { | 56 | 39.4k | debug_format!(e); | 57 | 39.4k | debug_format!(e.is_char_ref()); | 58 | 39.4k | debug_format!(e.resolve_char_ref()); | 59 | 39.4k | } | 60 | 3.25k | Ok(Event::PI(ref e)) => { | 61 | 3.25k | debug_format!(e); | 62 | 3.25k | } | 63 | 4.17k | Ok(Event::Decl(ref e)) => { | 64 | 4.17k | debug_format!(e); | 65 | 4.17k | let _ = black_box(e.version()); | 66 | 4.17k | let _ = black_box(e.encoding()); | 67 | 4.17k | let _ = black_box(e.standalone()); | 68 | 4.17k | match e.xml_version() { | 69 | 3.65k | Ok(v) => version = v, | 70 | 517 | Err(_) => break, | 71 | | } | 72 | | } | 73 | 1.19M | Ok(Event::End(e)) => { | 74 | 1.19M | debug_format!(e.local_name()); | 75 | 1.19M | let name = e.name(); | 76 | 1.19M | debug_format!(name); | 77 | 1.19M | debug_format!(name.prefix()); | 78 | 1.19M | debug_format!(name.local_name()); | 79 | 1.19M | debug_format!(name.decompose()); | 80 | 1.19M | debug_format!(name.as_namespace_binding()); | 81 | 1.19M | debug_format!(e); | 82 | 1.19M | } | 83 | 4.61k | Err(e) => { | 84 | 4.61k | debug_format!(e); | 85 | 4.61k | break; | 86 | | } | 87 | 4.82k | Ok(Event::Eof) => break, | 88 | | } | 89 | 8.43M | buf.clear(); | 90 | | } | 91 | 9.96k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 92 | 9.96k | } |
fuzz_target_1::round_trip::<&[u8]> Line | Count | Source | 14 | 7.78k | fn round_trip<R>(reader: &mut Reader<R>) -> () | 15 | 7.78k | where | 16 | 7.78k | R: std::io::BufRead, | 17 | | { | 18 | 7.78k | let mut version = XmlVersion::Implicit1_0; | 19 | 7.78k | let mut writer = Writer::new(Cursor::new(Vec::new())); | 20 | 7.78k | let mut buf = vec![]; | 21 | 7.78k | let config = reader.config_mut(); | 22 | 7.78k | config.expand_empty_elements = true; | 23 | 7.78k | config.trim_text(true); | 24 | | loop { | 25 | 5.60M | let event_result = reader.read_event_into(&mut buf); | 26 | 5.60M | if let Ok(ref event) = event_result { | 27 | 5.59M | let _event = black_box(event.borrow()); | 28 | 5.59M | let _event = black_box(event.as_ref()); | 29 | 5.59M | debug_format!(event); | 30 | 5.59M | debug_format!(writer.write_event(event.borrow())); | 31 | 5.59M | } | 32 | 5.59M | match event_result { | 33 | 4.54M | Ok(Event::Start(ref e)) | Ok(Event::Empty(ref e)) => { | 34 | 4.54M | debug_format!(e); | 35 | 4.54M | debug_format!(e.name()); | 36 | 4.54M | for a in e.attributes() { | 37 | 397k | debug_format!(a); | 38 | 397k | if a.ok() | 39 | 397k | .map_or(false, |a| a.normalized_value(version).is_err()) | 40 | | { | 41 | 4.20k | break; | 42 | 393k | } | 43 | | } | 44 | | } | 45 | 171k | Ok(Event::Text(ref e)) | Ok(Event::Comment(ref e)) | Ok(Event::DocType(ref e)) => { | 46 | 171k | debug_format!(e); | 47 | 171k | } | 48 | 40.5k | Ok(Event::CData(e)) => { | 49 | 40.5k | if let Err(err) = e.escape() { | 50 | 0 | let _displayed = black_box(format!("{}", err)); | 51 | 0 | debug_format!(err); | 52 | 0 | break; | 53 | 40.5k | } | 54 | | } | 55 | 35.4k | Ok(Event::GeneralRef(ref e)) => { | 56 | 35.4k | debug_format!(e); | 57 | 35.4k | debug_format!(e.is_char_ref()); | 58 | 35.4k | debug_format!(e.resolve_char_ref()); | 59 | 35.4k | } | 60 | 2.79k | Ok(Event::PI(ref e)) => { | 61 | 2.79k | debug_format!(e); | 62 | 2.79k | } | 63 | 3.45k | Ok(Event::Decl(ref e)) => { | 64 | 3.45k | debug_format!(e); | 65 | 3.45k | let _ = black_box(e.version()); | 66 | 3.45k | let _ = black_box(e.encoding()); | 67 | 3.45k | let _ = black_box(e.standalone()); | 68 | 3.45k | match e.xml_version() { | 69 | 3.01k | Ok(v) => version = v, | 70 | 445 | Err(_) => break, | 71 | | } | 72 | | } | 73 | 800k | Ok(Event::End(e)) => { | 74 | 800k | debug_format!(e.local_name()); | 75 | 800k | let name = e.name(); | 76 | 800k | debug_format!(name); | 77 | 800k | debug_format!(name.prefix()); | 78 | 800k | debug_format!(name.local_name()); | 79 | 800k | debug_format!(name.decompose()); | 80 | 800k | debug_format!(name.as_namespace_binding()); | 81 | 800k | debug_format!(e); | 82 | 800k | } | 83 | 2.51k | Err(e) => { | 84 | 2.51k | debug_format!(e); | 85 | 2.51k | break; | 86 | | } | 87 | 4.82k | Ok(Event::Eof) => break, | 88 | | } | 89 | 5.59M | buf.clear(); | 90 | | } | 91 | 7.78k | let _round_trip = std::hint::black_box(writer.into_inner().into_inner()); | 92 | 7.78k | } |
|
93 | | |
94 | | fuzz_target!(|data: &[u8]| { |
95 | | // From reader |
96 | | let cursor = Cursor::new(data); |
97 | | let mut reader = Reader::from_reader(cursor); |
98 | | _ = std::hint::black_box(round_trip(&mut reader)); |
99 | | |
100 | | // From str |
101 | | if let Ok(s) = std::str::from_utf8(data) { |
102 | | let mut reader = Reader::from_str(s); |
103 | | _ = std::hint::black_box(round_trip(&mut reader)); |
104 | | } |
105 | | }); |