wasmi/hfuzz/src/main.rs

71 lines
1.9 KiB
Rust
Raw Normal View History

2018-02-24 11:31:52 +00:00
#[macro_use] extern crate honggfuzz;
2018-02-24 12:21:36 +00:00
extern crate wabt;
extern crate wasmi;
extern crate tempdir;
use std::fs::File;
use std::io::Write;
use std::process::{Command, Stdio};
2018-03-25 10:28:01 +00:00
fn dump_all_into_buf(src: &[u8], buf: &mut [u8; 64]) {
let common_len = usize::min(src.len(), buf.len());
buf[0..common_len].copy_from_slice(&src[0..common_len]);
}
fn run_spec(data: &[u8], stdout_msg_buf: &mut [u8; 64], stderr_msg_buf: &mut [u8; 64]) -> Result<(), ()> {
2018-02-24 12:21:36 +00:00
let temp_dir = tempdir::TempDir::new("spec").unwrap();
let mut seed_path = temp_dir.path().to_path_buf();
seed_path.push("test.wasm");
{
let mut seedfile =
File::create(&seed_path).expect("open temporary file for writing to store fuzzer input");
seedfile.write_all(data).expect(
"write fuzzer input to temporary file",
);
seedfile.flush().expect(
"flush fuzzer input to temporary file before starting wasm-opt",
);
}
2018-03-25 10:28:01 +00:00
let output = Command::new("wasm")
2018-02-24 12:21:36 +00:00
.arg("-d")
.arg(&seed_path)
.stdout(Stdio::null())
.stderr(Stdio::null())
2018-03-25 10:28:01 +00:00
.output()
2018-02-24 12:21:36 +00:00
.expect("failed to execute `wasm`");
2018-03-25 10:28:01 +00:00
if output.status.success() {
2018-02-24 12:21:36 +00:00
Ok(())
} else {
2018-03-25 10:28:01 +00:00
dump_all_into_buf(&output.stdout, stdout_msg_buf);
dump_all_into_buf(&output.stderr, stderr_msg_buf);
2018-02-24 12:21:36 +00:00
Err(())
}
}
2018-02-24 11:31:52 +00:00
2018-02-24 12:21:36 +00:00
fn run_wasmi(data: &[u8]) -> Result<(), ()> {
let _ = wasmi::Module::from_buffer(data).map_err(|_| ())?;
Ok(())
}
fn main() {
2018-02-24 11:31:52 +00:00
loop {
fuzz!(|data: &[u8]| {
2018-03-25 10:28:01 +00:00
// Keep messages on stack. This should lead to a different stack hashes for
// different error messages.
let mut stdout_msg_buf: [u8; 64] = [0; 64];
let mut stderr_msg_buf: [u8; 64] = [0; 64];
2018-02-24 12:21:36 +00:00
let wasmi_result = run_wasmi(data);
2018-03-25 10:28:01 +00:00
let wasm_result = run_spec(data, &mut stdout_msg_buf, &mut stderr_msg_buf);
2018-02-24 12:21:36 +00:00
2018-03-25 10:28:01 +00:00
if wasmi_result.is_ok() != wasm_result.is_ok() {
panic!("stdout: {:?}, stderr: {:?}", &stdout_msg_buf[..], &stderr_msg_buf as &[u8]);
}
2018-02-24 11:31:52 +00:00
});
}
}