diff --git a/libafl/src/stages/mutational.rs b/libafl/src/stages/mutational.rs index 0f6a453e42..1f39e2747d 100644 --- a/libafl/src/stages/mutational.rs +++ b/libafl/src/stages/mutational.rs @@ -109,7 +109,11 @@ where manager: &mut EM, ) -> Result<(), Error> { start_timer!(state); - let num = self.iterations(state)? - self.execs_since_progress_start(state)?; + + // Here saturating_sub is needed as self.iterations() might be actually smaller than the previous value before reset. + let num = self + .iterations(state)? + .saturating_sub(self.execs_since_progress_start(state)?); let mut testcase = state.current_testcase_mut()?; let Ok(input) = I::try_transform_from(&mut testcase, state) else { diff --git a/libafl/src/stages/tuneable.rs b/libafl/src/stages/tuneable.rs index 9c386d4aa6..ed6f897130 100644 --- a/libafl/src/stages/tuneable.rs +++ b/libafl/src/stages/tuneable.rs @@ -222,7 +222,9 @@ where } (None, None) => { // fall back to random - let iters = self.iterations(state)? - self.execs_since_progress_start(state)?; + let iters = self + .iterations(state)? + .saturating_sub(self.execs_since_progress_start(state)?); for _ in 1..=iters { self.perform_mutation(fuzzer, executor, state, manager, &input)?; }