diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml new file mode 100644 index 0000000..fd55ded --- /dev/null +++ b/fuzz/Cargo.toml @@ -0,0 +1,25 @@ + +[package] +name = "parity-wasm-fuzz" +version = "0.0.1" +authors = ["Automatically generated"] +publish = false + +[package.metadata] +cargo-fuzz = true + +[dependencies.parity-wasm] +path = ".." +[dependencies.libfuzzer-sys] +git = "https://github.com/rust-fuzz/libfuzzer-sys.git" + +[dependencies.mktemp] +version = "0.3.1" + +# Prevent this from interfering with workspaces +[workspace] +members = ["."] + +[[bin]] +name = "fuzz_decode" +path = "fuzz_targets/fuzz_decode.rs" diff --git a/fuzz/fuzz_targets/fuzz_decode.rs b/fuzz/fuzz_targets/fuzz_decode.rs new file mode 100644 index 0000000..04cbe03 --- /dev/null +++ b/fuzz/fuzz_targets/fuzz_decode.rs @@ -0,0 +1,37 @@ +#![no_main] +#[macro_use] +extern crate libfuzzer_sys; +extern crate parity_wasm; +extern crate mktemp; + +use std::fs::File; +use std::io::Write; +use std::process::Command; + + +fuzz_target!(|data: &[u8]| { + let seed = mktemp::Temp::new_file().unwrap(); + let mut seedfile = File::create(seed.as_ref()).unwrap(); + seedfile.write_all(data).unwrap(); + seedfile.flush().unwrap(); + + let wasm = mktemp::Temp::new_file().unwrap(); + let opt_fuzz = Command::new("wasm-opt") + .arg("--translate-to-fuzz") + .arg(seed.as_ref()) + .arg("-o") + .arg(wasm.as_ref()) + .output() + .unwrap(); + + assert!( + opt_fuzz.status.success(), + format!( + "wasm-opt failed with: {}", + String::from_utf8_lossy(&opt_fuzz.stderr) + ) + ); + + let _module: parity_wasm::elements::Module = parity_wasm::deserialize_file(wasm.as_ref()) + .unwrap(); +});