2017-09-06 17:33:12 -07:00
|
|
|
#![no_main]
|
|
|
|
#[macro_use]
|
|
|
|
extern crate libfuzzer_sys;
|
|
|
|
extern crate parity_wasm;
|
|
|
|
extern crate mktemp;
|
|
|
|
|
|
|
|
use std::fs::File;
|
|
|
|
use std::io::Write;
|
2017-09-07 13:01:14 -07:00
|
|
|
use std::path::PathBuf;
|
2017-09-06 17:33:12 -07:00
|
|
|
use std::process::Command;
|
|
|
|
|
2017-09-07 13:01:14 -07:00
|
|
|
fn wasm_opt() -> PathBuf {
|
|
|
|
let bin = PathBuf::from(env!("OUT_DIR")).join("bin").join("wasm-opt");
|
|
|
|
assert!(
|
|
|
|
bin.exists(),
|
|
|
|
format!("could not find wasm-opt at: {:?}", wasm_opt())
|
|
|
|
);
|
|
|
|
bin
|
|
|
|
}
|
2017-09-06 17:33:12 -07:00
|
|
|
|
|
|
|
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();
|
2017-09-07 13:01:14 -07:00
|
|
|
let opt_fuzz = Command::new(wasm_opt())
|
2017-09-06 17:33:12 -07:00
|
|
|
.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();
|
|
|
|
});
|