diff --git a/src/executors/mod.rs b/src/executors/mod.rs index e61bb2536c..b560b715cb 100644 --- a/src/executors/mod.rs +++ b/src/executors/mod.rs @@ -2,6 +2,8 @@ use crate::AflError; use crate::inputs::Input; use crate::observers::Observer; +use std::ptr; + pub enum ExitKind { Ok, Crash, @@ -15,13 +17,19 @@ pub trait Executor { fn place_input(&mut self, input: Box) -> Result<(), AflError>; + fn reset_observers(&mut self) -> Result<(), AflError>; + + fn post_exec_observers(&mut self) -> Result<(), AflError>; + + fn add_observer(&mut self, observer: Box); + } // TODO abstract classes? how? pub struct ExecutorBase { observers: Vec>, - cur_input: Box + cur_input: Option> } @@ -34,24 +42,45 @@ pub struct InMemoryExecutor { } -static mut CURRENT_INMEMORY_EXECUTOR: Option<&InMemoryExecutor> = None; +static mut CURRENT_INMEMORY_EXECUTOR_PTR: *const InMemoryExecutor = ptr::null(); impl Executor for InMemoryExecutor { fn run_target(&mut self) -> Result { - let bytes = self.base.cur_input.serialize(); - unsafe { CURRENT_INMEMORY_EXECUTOR = Some(self); } - let outcome = match bytes { + let bytes = match self.base.cur_input.as_ref() { + Some(i) => i.serialize(), + None => return Err(AflError::Unknown) + }; + unsafe { CURRENT_INMEMORY_EXECUTOR_PTR = self as *const InMemoryExecutor; } + let ret = match bytes { Ok(b) => Ok((self.harness)(self, b)), Err(e) => Err(e) }; - unsafe { CURRENT_INMEMORY_EXECUTOR = None; } - outcome + unsafe { CURRENT_INMEMORY_EXECUTOR_PTR = ptr::null(); } + ret } fn place_input(&mut self, input: Box) -> Result<(), AflError> { - self.base.cur_input = input; + self.base.cur_input = Some(input); Ok(()) } + fn reset_observers(&mut self) -> Result<(), AflError> { + for observer in &mut self.base.observers { + observer.reset()?; + } + Ok(()) + } + + fn post_exec_observers(&mut self) -> Result<(), AflError> { + for observer in &mut self.base.observers { + observer.post_exec(self)?; + } + Ok(()) + } + + fn add_observer(&mut self, observer: Box) { + self.base.observers.push(observer); + } + } \ No newline at end of file diff --git a/src/observers/mod.rs b/src/observers/mod.rs index 22d8a103d7..88db5fb53c 100644 --- a/src/observers/mod.rs +++ b/src/observers/mod.rs @@ -1,4 +1,5 @@ use crate::AflError; +use crate::executors::Executor; pub trait Observer { @@ -8,7 +9,7 @@ pub trait Observer { fn reset(&mut self) -> Result<(), AflError>; - fn post_exec(&mut self) -> Result<(), AflError> { + fn post_exec(&mut self, executor: &mut dyn Executor) -> Result<(), AflError> { Ok(()) }