return last error from observers, if any, code fmt

This commit is contained in:
Dominik Maier 2020-10-28 15:35:34 +01:00
parent 90a16762ff
commit db9413e223
3 changed files with 18 additions and 23 deletions

View File

@ -1,19 +1,17 @@
use crate::AflError;
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::Observer; use crate::observers::Observer;
use crate::AflError;
use std::ptr; use std::ptr;
use std::iter;
pub enum ExitKind { pub enum ExitKind {
Ok, Ok,
Crash, Crash,
OOM, OOM,
Timeout Timeout,
} }
pub trait Executor { pub trait Executor {
fn run_target(&mut self) -> Result<ExitKind, AflError>; fn run_target(&mut self) -> Result<ExitKind, AflError>;
fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError>; fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError>;
@ -23,41 +21,39 @@ pub trait Executor {
fn post_exec_observers(&mut self) -> Result<(), AflError>; fn post_exec_observers(&mut self) -> Result<(), AflError>;
fn add_observer(&mut self, observer: Box<dyn Observer>); fn add_observer(&mut self, observer: Box<dyn Observer>);
} }
// TODO abstract classes? how? // TODO abstract classes? how?
pub struct ExecutorBase { pub struct ExecutorBase {
observers: Vec<Box<dyn Observer>>, observers: Vec<Box<dyn Observer>>,
cur_input: Option<Box<dyn Input>> cur_input: Option<Box<dyn Input>>,
} }
type HarnessFunction = fn(&dyn Executor, &[u8]) -> ExitKind; type HarnessFunction = fn(&dyn Executor, &[u8]) -> ExitKind;
pub struct InMemoryExecutor { pub struct InMemoryExecutor {
base: ExecutorBase, base: ExecutorBase,
harness: HarnessFunction, harness: HarnessFunction,
} }
static mut CURRENT_INMEMORY_EXECUTOR_PTR: *const InMemoryExecutor = ptr::null(); static mut CURRENT_INMEMORY_EXECUTOR_PTR: *const InMemoryExecutor = ptr::null();
impl Executor for InMemoryExecutor { impl Executor for InMemoryExecutor {
fn run_target(&mut self) -> Result<ExitKind, AflError> { fn run_target(&mut self) -> Result<ExitKind, AflError> {
let bytes = match self.base.cur_input.as_ref() { let bytes = match self.base.cur_input.as_ref() {
Some(i) => i.serialize(), Some(i) => i.serialize(),
None => return Err(AflError::Unknown) None => return Err(AflError::Unknown),
}; };
unsafe { CURRENT_INMEMORY_EXECUTOR_PTR = self as *const InMemoryExecutor; } unsafe {
CURRENT_INMEMORY_EXECUTOR_PTR = self as *const InMemoryExecutor;
}
let ret = match bytes { let ret = match bytes {
Ok(b) => Ok((self.harness)(self, b)), Ok(b) => Ok((self.harness)(self, b)),
Err(e) => Err(e) Err(e) => Err(e),
}; };
unsafe { CURRENT_INMEMORY_EXECUTOR_PTR = ptr::null(); } unsafe {
CURRENT_INMEMORY_EXECUTOR_PTR = ptr::null();
}
ret ret
} }
@ -74,12 +70,14 @@ impl Executor for InMemoryExecutor {
} }
fn post_exec_observers(&mut self) -> Result<(), AflError> { fn post_exec_observers(&mut self) -> Result<(), AflError> {
self.base.observers.iter_mut().map(|x| x.post_exec()); self.base
Ok(()) .observers
.iter_mut()
.map(|x| x.post_exec())
.fold(Ok(()), |acc, x| if x.is_err() { x } else { acc })
} }
fn add_observer(&mut self, observer: Box<dyn Observer>) { fn add_observer(&mut self, observer: Box<dyn Observer>) {
self.base.observers.push(observer); self.base.observers.push(observer);
} }
} }

View File

@ -8,9 +8,9 @@ pub mod feedbacks;
pub mod inputs; pub mod inputs;
pub mod monitors; pub mod monitors;
pub mod mutators; pub mod mutators;
pub mod observers;
pub mod stages; pub mod stages;
pub mod utils; pub mod utils;
pub mod observers;
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum AflError { pub enum AflError {

View File

@ -1,8 +1,6 @@
use crate::AflError; use crate::AflError;
use crate::executors::Executor;
pub trait Observer { pub trait Observer {
fn flush(&mut self) -> Result<(), AflError> { fn flush(&mut self) -> Result<(), AflError> {
Ok(()) Ok(())
} }
@ -12,5 +10,4 @@ pub trait Observer {
fn post_exec(&mut self) -> Result<(), AflError> { fn post_exec(&mut self) -> Result<(), AflError> {
Ok(()) Ok(())
} }
} }