builds
This commit is contained in:
parent
7bd37bdc8e
commit
15fc19decf
@ -521,12 +521,22 @@ mod tests {
|
||||
let testcase = Testcase::new(vec![0; 4]).into();
|
||||
corpus.add(testcase);
|
||||
|
||||
let executor = InMemoryExecutor::<BytesInput, _>::new("main", harness, tuple_list!(), None);
|
||||
let mut state = State::new(tuple_list!());
|
||||
|
||||
let mut events_manager = LoggerEventManager::new(SimpleStats::new(|s| {
|
||||
let mut event_manager = LoggerEventManager::new(SimpleStats::new(|s| {
|
||||
println!("{}", s);
|
||||
}));
|
||||
|
||||
let executor = InMemoryExecutor::new(
|
||||
"main",
|
||||
harness,
|
||||
tuple_list!(),
|
||||
Box::new(|_, _| ()),
|
||||
&state,
|
||||
&corpus,
|
||||
&mut event_manager,
|
||||
);
|
||||
|
||||
let mut engine = Engine::new(executor);
|
||||
let mut mutator = StdScheduledMutator::new();
|
||||
mutator.add_mutation(mutation_bitflip);
|
||||
@ -540,7 +550,7 @@ mod tests {
|
||||
&mut state,
|
||||
&mut corpus,
|
||||
&mut engine,
|
||||
&mut events_manager,
|
||||
&mut event_manager,
|
||||
)
|
||||
.expect(&format!("Error in iter {}", i));
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ use self::unix_signals::setup_crash_handlers;
|
||||
/// The (unsafe) pointer to the current inmem input, for the current run.
|
||||
/// This is neede for certain non-rust side effects, as well as unix signal handling.
|
||||
static mut CURRENT_INPUT_PTR: *const c_void = ptr::null();
|
||||
static mut CURRENT_ON_CRASH_FN: *const Box<dyn FnOnce(ExitKind, &[u8])> = ptr::null();
|
||||
static mut CURRENT_ON_CRASH_FN: *mut Box<dyn FnMut(ExitKind, &[u8])> = ptr::null_mut();
|
||||
|
||||
/// The inmem executor harness
|
||||
type HarnessFunction<I> = fn(&dyn Executor<I>, &[u8]) -> ExitKind;
|
||||
@ -37,7 +37,7 @@ where
|
||||
/// The observers, observing each run
|
||||
observers: OT,
|
||||
/// A special function being called right before the process crashes. It may save state to restore fuzzing after respawn.
|
||||
on_crash_fn: Box<dyn FnOnce(ExitKind, &[u8])>,
|
||||
on_crash_fn: Box<dyn FnMut(ExitKind, &[u8])>,
|
||||
}
|
||||
|
||||
impl<I, OT> Executor<I> for InMemoryExecutor<I, OT>
|
||||
@ -49,12 +49,12 @@ where
|
||||
fn run_target(&mut self, input: &I) -> Result<ExitKind, AflError> {
|
||||
let bytes = input.target_bytes();
|
||||
unsafe {
|
||||
CURRENT_ON_CRASH_FN = &self.on_crash_fn as *const _;
|
||||
CURRENT_ON_CRASH_FN = &mut self.on_crash_fn as *mut _;
|
||||
CURRENT_INPUT_PTR = input as *const _ as *const c_void;
|
||||
}
|
||||
let ret = (self.harness)(self, bytes.as_slice());
|
||||
unsafe {
|
||||
CURRENT_ON_CRASH_FN = ptr::null();
|
||||
CURRENT_ON_CRASH_FN = ptr::null_mut();
|
||||
CURRENT_INPUT_PTR = ptr::null();
|
||||
}
|
||||
Ok(ret)
|
||||
@ -102,7 +102,7 @@ where
|
||||
name: &'static str,
|
||||
harness_fn: HarnessFunction<I>,
|
||||
observers: OT,
|
||||
on_crash_fn: Box<dyn FnOnce(ExitKind, &[u8])>,
|
||||
on_crash_fn: Box<dyn FnMut(ExitKind, &[u8])>,
|
||||
state: &State<I, R, FT, OT>,
|
||||
corpus: &C,
|
||||
event_manager: &mut EM,
|
||||
@ -365,9 +365,11 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn test_inmem_exec() {
|
||||
/*
|
||||
let mut in_mem_executor =
|
||||
InMemoryExecutor::new("main", test_harness_fn_nop, tuple_list!(), Box::new(|_| ()));
|
||||
let mut input = NopInput {};
|
||||
assert!(in_mem_executor.run_target(&mut input).is_ok());
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,10 @@ use afl::{
|
||||
shmem::{AflShmem, ShMem},
|
||||
LlmpEventManager, SimpleStats,
|
||||
},
|
||||
executors::{inmemory::InMemoryExecutor, Executor, ExitKind},
|
||||
executors::{
|
||||
inmemory::{deserialize_state_corpus, InMemoryExecutor},
|
||||
Executor, ExitKind,
|
||||
},
|
||||
feedbacks::MaxMapFeedback,
|
||||
generators::RandPrintablesGenerator,
|
||||
mutators::{scheduled::HavocBytesMutator, HasMaxSize},
|
||||
@ -127,7 +130,7 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), AflError> {
|
||||
(state, corpus)
|
||||
}
|
||||
// Restoring from a previous run, deserialize state and corpus.
|
||||
Some((_sender, _tag, msg)) => postcard::from_bytes(msg)?,
|
||||
Some((_sender, _tag, msg)) => deserialize_state_corpus(&msg)?,
|
||||
};
|
||||
// We reset the sender, the next sender and receiver (after crash) will reuse the page from the initial message.
|
||||
unsafe { sender.reset_last_page() };
|
||||
@ -137,13 +140,12 @@ fn fuzz(input: Option<Vec<PathBuf>>, broker_port: u16) -> Result<(), AflError> {
|
||||
"Libfuzzer",
|
||||
harness,
|
||||
tuple_list!(edges_observer),
|
||||
Some(Box::new(|exit_kind| {
|
||||
// TODO: How to access state, corpus? Unsafe is fine?
|
||||
/*
|
||||
let serialized = postcard::to_allocvec(&(state, corpus)).unwrap();
|
||||
sender.send_buf(0x1, &serialized).unwrap();
|
||||
*/
|
||||
})),
|
||||
Box::new(move |exit_kind, state_corpus_serialized| {
|
||||
sender.send_buf(0x1, &state_corpus_serialized).unwrap();
|
||||
}),
|
||||
&state,
|
||||
&corpus,
|
||||
&mut mgr,
|
||||
);
|
||||
|
||||
let mut engine = Engine::new(executor);
|
||||
|
Loading…
x
Reference in New Issue
Block a user