diff --git a/src/engines/mod.rs b/src/engines/mod.rs index 6b71cc7965..dbd7e32663 100644 --- a/src/engines/mod.rs +++ b/src/engines/mod.rs @@ -31,8 +31,9 @@ where } fn fuzz_one(&mut self, corpus: &mut C) -> Result<(), AflError> { + let testcase = corpus.next()?; for stage in self.stages_mut() { - stage.perform(corpus)?; + stage.perform(testcase.clone(), corpus)?; } Ok(()) } diff --git a/src/stages/mod.rs b/src/stages/mod.rs index 19dd7f7afe..31f610df4d 100644 --- a/src/stages/mod.rs +++ b/src/stages/mod.rs @@ -1,9 +1,12 @@ pub mod mutational; pub use mutational::DefaultMutationalStage; +use crate::corpus::testcase::Testcase; use crate::corpus::Corpus; use crate::inputs::Input; use crate::AflError; +use alloc::rc::Rc; +use core::cell::RefCell; pub trait Stage where @@ -11,5 +14,9 @@ where I: Input, { /// Run the stage - fn perform(&mut self, corpus: &mut C) -> Result<(), AflError>; + fn perform( + &mut self, + testcase: Rc>>, + corpus: &mut C, + ) -> Result<(), AflError>; } diff --git a/src/stages/mutational.rs b/src/stages/mutational.rs index 80ad11abf9..51fff08ff6 100644 --- a/src/stages/mutational.rs +++ b/src/stages/mutational.rs @@ -36,8 +36,11 @@ where } /// Runs this (mutational) stage for the given testcase - fn perform_mutational(&mut self, corpus: &mut C) -> Result<(), AflError> { - let testcase = corpus.next()?; + fn perform_mutational( + &mut self, + testcase: Rc>>, + corpus: &mut C, + ) -> Result<(), AflError> { let num = self.iterations(); let input = testcase.borrow_mut().load_input()?.clone(); @@ -120,8 +123,12 @@ where M: Mutator, E: Executor, { - fn perform(&mut self, corpus: &mut C) -> Result<(), AflError> { - self.perform_mutational(corpus) + fn perform( + &mut self, + testcase: Rc>>, + corpus: &mut C, + ) -> Result<(), AflError> { + self.perform_mutational(testcase, corpus) } }