Skip to content

Commit 83e8f65

Browse files
authored
test(fuzz): fuzz xml5ever (#557)
* test(fuzz): fuzz xml5ever * style: drop newline on */fuzz/.gitignore
1 parent a831e82 commit 83e8f65

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

html5ever/fuzz/.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
target
32
corpus
43
artifacts

xml5ever/fuzz/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
target
2+
corpus
3+
artifacts

xml5ever/fuzz/Cargo.toml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
2+
[package]
3+
name = "xml5ever-fuzz"
4+
version = "0.0.0"
5+
authors = ["David Korczynski <david@adalogics.com>"]
6+
publish = false
7+
edition = "2018"
8+
9+
[package.metadata]
10+
cargo-fuzz = true
11+
12+
[dependencies]
13+
libfuzzer-sys = "0.4.0"
14+
15+
[dependencies.xml5ever]
16+
path = ".."
17+
18+
[dependencies.markup5ever_rcdom]
19+
path = "../../rcdom/"
20+
21+
# Prevent this from interfering with workspaces
22+
[workspace]
23+
members = ["."]
24+
25+
[[bin]]
26+
name = "fuzz_document_parse"
27+
path = "fuzz_targets/fuzz_document_parse.rs"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#![no_main]
2+
use libfuzzer_sys::fuzz_target;
3+
4+
use markup5ever_rcdom::{RcDom, SerializableHandle};
5+
use std::io::BufReader;
6+
use xml5ever::driver::parse_document;
7+
use xml5ever::driver::XmlParseOpts;
8+
use xml5ever::serialize::serialize;
9+
use xml5ever::tendril::TendrilSink;
10+
use xml5ever::tree_builder::XmlTreeBuilderOpts;
11+
12+
// Target inspired by the Rust-Fuzz project
13+
// https://github.com/rust-fuzz/targets
14+
fuzz_target!(|data: &[u8]| {
15+
let opts = XmlParseOpts {
16+
tree_builder: XmlTreeBuilderOpts {
17+
..Default::default()
18+
},
19+
..Default::default()
20+
};
21+
22+
let dom = parse_document(RcDom::default(), opts)
23+
.from_utf8()
24+
.read_from(&mut BufReader::new(data));
25+
26+
let dom = if let Ok(dom) = dom {
27+
dom
28+
} else {
29+
return;
30+
};
31+
32+
let mut out = std::io::sink();
33+
let document: SerializableHandle = dom.document.into();
34+
let _ = serialize(&mut out, &document, Default::default());
35+
});

0 commit comments

Comments
 (0)