fix byte input reading

This commit is contained in:
Alwin Berger 2022-02-22 00:09:15 +01:00
parent b73a971c51
commit ffdaf22b1d

View File

@ -1,5 +1,6 @@
//! A singlethreaded QEMU fuzzer that can auto-restart. //! A singlethreaded QEMU fuzzer that can auto-restart.
use std::io::Read;
use wcet_qemu_sys::system_trace::QemuSysStateObserver; use wcet_qemu_sys::system_trace::QemuSysStateObserver;
use wcet_qemu_sys::worst::QemuHashMapObserver; use wcet_qemu_sys::worst::QemuHashMapObserver;
use wcet_qemu_sys::{ use wcet_qemu_sys::{
@ -140,7 +141,13 @@ pub fn main() {
out_dir.push("queue"); out_dir.push("queue");
let seed = match res.value_of("single") { let seed = match res.value_of("single") {
Some(s) => Left(s.to_string()), Some(s) => if s=="-" {
let mut buf = Vec::<u8>::new();
std::io::stdin().read_to_end(&mut buf).expect("Could not read Stdin");
Left(buf)
} else {
Left(s.as_bytes().to_owned())
},
None => { None => {
let in_dir = PathBuf::from(res.value_of("in").unwrap().to_string()); let in_dir = PathBuf::from(res.value_of("in").unwrap().to_string());
if !in_dir.is_dir() { if !in_dir.is_dir() {
@ -150,6 +157,7 @@ pub fn main() {
Right(in_dir) Right(in_dir)
}, },
}; };
println!("{:?}",seed);
let kernel = PathBuf::from(res.value_of("k").unwrap().to_string()); let kernel = PathBuf::from(res.value_of("k").unwrap().to_string());
let edges = match res.value_of("edges") { let edges = match res.value_of("edges") {
@ -178,7 +186,7 @@ fn virt2phys(vaddr : u64, tab : &goblin::elf::Elf) -> u64 {
/// The actual fuzzer /// The actual fuzzer
fn fuzz( fn fuzz(
seed: Either<String,PathBuf>, seed: Either<Vec<u8>,PathBuf>,
kernel: PathBuf, kernel: PathBuf,
dump_edges: Option<PathBuf>, dump_edges: Option<PathBuf>,
snapshot: PathBuf, snapshot: PathBuf,
@ -316,7 +324,7 @@ fn fuzz(
ExitKind::Ok ExitKind::Ok
}; };
//======= Set System-State watchpoints //======= Set System-State watchpoints
let system_state_filter = QemuInstrumentationFilter::AllowList(vec![svh..svh+1]); let system_state_filter = QemuInstrumentationFilter::AllowList(vec![svh..svh+1,systick_handler..systick_handler+1,svc_handle..svc_handle+1]);
//======= Construct the executor, including the Helpers. The edges_observer still contains the ref to EDGES_MAP //======= Construct the executor, including the Helpers. The edges_observer still contains the ref to EDGES_MAP
let mut executor = QemuExecutor::new( let mut executor = QemuExecutor::new(
@ -351,7 +359,7 @@ fn fuzz(
}, },
Left(s) => { Left(s) => {
fuzzer.evaluate_input(&mut state, &mut executor, &mut mgr, BytesInput::new(s.as_bytes().to_vec())).expect("Evaluation failed"); fuzzer.evaluate_input(&mut state, &mut executor, &mut mgr, BytesInput::new(s)).expect("Evaluation failed");
} }
} }
// let firstinput = match seed.clone().is_dir() { // let firstinput = match seed.clone().is_dir() {