almost complete inmemexecutor

This commit is contained in:
Andrea Fioraldi 2020-10-28 09:51:29 +01:00
parent e7578305d6
commit b553fdc20f
2 changed files with 39 additions and 9 deletions

View File

@ -2,6 +2,8 @@ use crate::AflError;
use crate::inputs::Input; use crate::inputs::Input;
use crate::observers::Observer; use crate::observers::Observer;
use std::ptr;
pub enum ExitKind { pub enum ExitKind {
Ok, Ok,
Crash, Crash,
@ -15,13 +17,19 @@ pub trait Executor {
fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError>; fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError>;
fn reset_observers(&mut self) -> Result<(), AflError>;
fn post_exec_observers(&mut self) -> Result<(), AflError>;
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: Box<dyn Input> cur_input: Option<Box<dyn Input>>
} }
@ -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 { impl Executor for InMemoryExecutor {
fn run_target(&mut self) -> Result<ExitKind, AflError> { fn run_target(&mut self) -> Result<ExitKind, AflError> {
let bytes = self.base.cur_input.serialize(); let bytes = match self.base.cur_input.as_ref() {
unsafe { CURRENT_INMEMORY_EXECUTOR = Some(self); } Some(i) => i.serialize(),
let outcome = match bytes { 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)), Ok(b) => Ok((self.harness)(self, b)),
Err(e) => Err(e) Err(e) => Err(e)
}; };
unsafe { CURRENT_INMEMORY_EXECUTOR = None; } unsafe { CURRENT_INMEMORY_EXECUTOR_PTR = ptr::null(); }
outcome ret
} }
fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError> { fn place_input(&mut self, input: Box<dyn Input>) -> Result<(), AflError> {
self.base.cur_input = input; self.base.cur_input = Some(input);
Ok(()) 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<dyn Observer>) {
self.base.observers.push(observer);
}
} }

View File

@ -1,4 +1,5 @@
use crate::AflError; use crate::AflError;
use crate::executors::Executor;
pub trait Observer { pub trait Observer {
@ -8,7 +9,7 @@ pub trait Observer {
fn reset(&mut self) -> Result<(), AflError>; 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(()) Ok(())
} }