diff --git a/libafl_qemu/src/emu/hooks.rs b/libafl_qemu/src/emu/hooks.rs index a0fe5135e3..5447996132 100644 --- a/libafl_qemu/src/emu/hooks.rs +++ b/libafl_qemu/src/emu/hooks.rs @@ -1118,17 +1118,17 @@ where modules } - pub fn first_exec_all(&mut self) { + pub fn first_exec_all(&mut self, state: &mut S) { unsafe { self.modules_mut() - .first_exec_all(Self::emulator_modules_mut_unchecked()); + .first_exec_all(Self::emulator_modules_mut_unchecked(), state); } } - pub fn pre_exec_all(&mut self, input: &S::Input) { + pub fn pre_exec_all(&mut self, input: &S::Input, state: &mut S) { unsafe { self.modules_mut() - .pre_exec_all(Self::emulator_modules_mut_unchecked(), input); + .pre_exec_all(Self::emulator_modules_mut_unchecked(), input, state); } } @@ -1136,6 +1136,7 @@ where &mut self, input: &S::Input, observers: &mut OT, + state: &mut S, exit_kind: &mut ExitKind, ) where OT: ObserversTuple, @@ -1145,6 +1146,7 @@ where Self::emulator_modules_mut_unchecked(), input, observers, + state, exit_kind, ); } diff --git a/libafl_qemu/src/emu/mod.rs b/libafl_qemu/src/emu/mod.rs index d930409a2c..d2a060253e 100644 --- a/libafl_qemu/src/emu/mod.rs +++ b/libafl_qemu/src/emu/mod.rs @@ -338,26 +338,28 @@ where }) } - pub fn first_exec_all(&mut self) { + pub fn first_exec_all(&mut self, state: &mut S) { if self.first_exec { - self.modules.first_exec_all(); + self.modules.first_exec_all(state); self.first_exec = false; } } - pub fn pre_exec_all(&mut self, input: &S::Input) { - self.modules.pre_exec_all(input); + pub fn pre_exec_all(&mut self, input: &S::Input, state: &mut S) { + self.modules.pre_exec_all(input, state); } pub fn post_exec_all( &mut self, input: &S::Input, observers: &mut OT, + state: &mut S, exit_kind: &mut ExitKind, ) where OT: ObserversTuple, { - self.modules.post_exec_all(input, observers, exit_kind); + self.modules + .post_exec_all(input, observers, state, exit_kind); } } diff --git a/libafl_qemu/src/executor.rs b/libafl_qemu/src/executor.rs index e239977d5c..e43ac51e87 100644 --- a/libafl_qemu/src/executor.rs +++ b/libafl_qemu/src/executor.rs @@ -205,15 +205,20 @@ where mgr: &mut EM, input: &Self::Input, ) -> Result { - self.inner.exposed_executor_state_mut().first_exec_all(); + self.inner + .exposed_executor_state_mut() + .first_exec_all(state); - self.inner.exposed_executor_state_mut().pre_exec_all(input); + self.inner + .exposed_executor_state_mut() + .pre_exec_all(input, state); let mut exit_kind = self.inner.run_target(fuzzer, state, mgr, input)?; self.inner.exposed_executor_state.post_exec_all( input, &mut *self.inner.inner.observers_mut(), + state, &mut exit_kind, ); diff --git a/libafl_qemu/src/modules/calls.rs b/libafl_qemu/src/modules/calls.rs index f870af154c..773f6afeff 100644 --- a/libafl_qemu/src/modules/calls.rs +++ b/libafl_qemu/src/modules/calls.rs @@ -412,8 +412,12 @@ where ); } - fn pre_exec(&mut self, emulator_modules: &mut EmulatorModules, input: &S::Input) - where + fn pre_exec( + &mut self, + emulator_modules: &mut EmulatorModules, + input: &S::Input, + _state: &mut S, + ) where ET: EmulatorModuleTuple, { self.collectors @@ -427,6 +431,7 @@ where emulator_modules: &mut EmulatorModules, input: &S::Input, observers: &mut OT, + _state: &mut S, exit_kind: &mut ExitKind, ) where OT: ObserversTuple, diff --git a/libafl_qemu/src/modules/cmplog.rs b/libafl_qemu/src/modules/cmplog.rs index 4750186a2d..03c0d0edda 100644 --- a/libafl_qemu/src/modules/cmplog.rs +++ b/libafl_qemu/src/modules/cmplog.rs @@ -81,7 +81,7 @@ impl EmulatorModule for CmpLogModule where S: Unpin + UsesInput + HasMetadata, { - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -124,7 +124,7 @@ where { const HOOKS_DO_SIDE_EFFECTS: bool = false; - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -363,7 +363,7 @@ impl EmulatorModule for CmpLogRoutinesModule where S: Unpin + UsesInput, { - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { diff --git a/libafl_qemu/src/modules/edges.rs b/libafl_qemu/src/modules/edges.rs index 767ea5b20c..f7b96031c7 100644 --- a/libafl_qemu/src/modules/edges.rs +++ b/libafl_qemu/src/modules/edges.rs @@ -157,7 +157,7 @@ impl EmulatorModule for EdgeCoverageModule where S: Unpin + UsesInput + HasMetadata, { - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -308,7 +308,7 @@ where { const HOOKS_DO_SIDE_EFFECTS: bool = false; - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -454,7 +454,7 @@ where { const HOOKS_DO_SIDE_EFFECTS: bool = false; - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { diff --git a/libafl_qemu/src/modules/mod.rs b/libafl_qemu/src/modules/mod.rs index 2f13f9015b..57a1623b6f 100644 --- a/libafl_qemu/src/modules/mod.rs +++ b/libafl_qemu/src/modules/mod.rs @@ -48,14 +48,18 @@ where { } - fn first_exec(&mut self, _emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, _emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { } - fn pre_exec(&mut self, _emulator_modules: &mut EmulatorModules, _input: &S::Input) - where + fn pre_exec( + &mut self, + _emulator_modules: &mut EmulatorModules, + _input: &S::Input, + _state: &mut S, + ) where ET: EmulatorModuleTuple, { } @@ -65,6 +69,7 @@ where _emulator_modules: &mut EmulatorModules, _input: &S::Input, _observers: &mut OT, + _state: &mut S, _exit_kind: &mut ExitKind, ) where OT: ObserversTuple, @@ -84,14 +89,18 @@ where where ET: EmulatorModuleTuple; - fn first_exec_all(&mut self, _emulator_modules: &mut EmulatorModules) - where + fn first_exec_all( + &mut self, + _emulator_modules: &mut EmulatorModules, + _state: &mut S, + ) where ET: EmulatorModuleTuple; fn pre_exec_all( &mut self, _emulator_modules: &mut EmulatorModules, _input: &S::Input, + _state: &mut S, ) where ET: EmulatorModuleTuple; @@ -100,6 +109,7 @@ where _emulator_modules: &mut EmulatorModules, _input: &S::Input, _observers: &mut OT, + _state: &mut S, _exit_kind: &mut ExitKind, ) where OT: ObserversTuple, @@ -118,7 +128,7 @@ where { } - fn first_exec_all(&mut self, _emulator_modules: &mut EmulatorModules) + fn first_exec_all(&mut self, _emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -128,6 +138,7 @@ where &mut self, _emulator_modules: &mut EmulatorModules, _input: &S::Input, + _state: &mut S, ) where ET: EmulatorModuleTuple, { @@ -138,6 +149,7 @@ where _emulator_modules: &mut EmulatorModules, _input: &S::Input, _observers: &mut OT, + _state: &mut S, _exit_kind: &mut ExitKind, ) where OT: ObserversTuple, @@ -162,20 +174,24 @@ where self.1.init_modules_all(emulator_modules); } - fn first_exec_all(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec_all(&mut self, emulator_modules: &mut EmulatorModules, state: &mut S) where ET: EmulatorModuleTuple, { - self.0.first_exec(emulator_modules); - self.1.first_exec_all(emulator_modules); + self.0.first_exec(emulator_modules, state); + self.1.first_exec_all(emulator_modules, state); } - fn pre_exec_all(&mut self, emulator_modules: &mut EmulatorModules, input: &S::Input) - where + fn pre_exec_all( + &mut self, + emulator_modules: &mut EmulatorModules, + input: &S::Input, + state: &mut S, + ) where ET: EmulatorModuleTuple, { - self.0.pre_exec(emulator_modules, input); - self.1.pre_exec_all(emulator_modules, input); + self.0.pre_exec(emulator_modules, input, state); + self.1.pre_exec_all(emulator_modules, input, state); } fn post_exec_all( @@ -183,15 +199,16 @@ where emulator_modules: &mut EmulatorModules, input: &S::Input, observers: &mut OT, + state: &mut S, exit_kind: &mut ExitKind, ) where OT: ObserversTuple, ET: EmulatorModuleTuple, { self.0 - .post_exec(emulator_modules, input, observers, exit_kind); + .post_exec(emulator_modules, input, observers, state, exit_kind); self.1 - .post_exec_all(emulator_modules, input, observers, exit_kind); + .post_exec_all(emulator_modules, input, observers, state, exit_kind); } } diff --git a/libafl_qemu/src/modules/usermode/asan.rs b/libafl_qemu/src/modules/usermode/asan.rs index 1e71e68632..ff010dea1a 100644 --- a/libafl_qemu/src/modules/usermode/asan.rs +++ b/libafl_qemu/src/modules/usermode/asan.rs @@ -940,7 +940,7 @@ where } } - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -975,8 +975,12 @@ where } } - fn pre_exec(&mut self, emulator_modules: &mut EmulatorModules, _input: &S::Input) - where + fn pre_exec( + &mut self, + emulator_modules: &mut EmulatorModules, + _input: &S::Input, + _state: &mut S, + ) where ET: EmulatorModuleTuple, { if self.empty { @@ -990,6 +994,7 @@ where emulator_modules: &mut EmulatorModules, _input: &S::Input, _observers: &mut OT, + _state: &mut S, exit_kind: &mut ExitKind, ) where OT: ObserversTuple, diff --git a/libafl_qemu/src/modules/usermode/asan_guest.rs b/libafl_qemu/src/modules/usermode/asan_guest.rs index 20582dc2d6..3528527210 100644 --- a/libafl_qemu/src/modules/usermode/asan_guest.rs +++ b/libafl_qemu/src/modules/usermode/asan_guest.rs @@ -273,7 +273,7 @@ impl EmulatorModule for AsanGuestModule where S: Unpin + UsesInput, { - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, S: Unpin + UsesInput, diff --git a/libafl_qemu/src/modules/usermode/drcov.rs b/libafl_qemu/src/modules/usermode/drcov.rs index f57adb6bec..e3786802b3 100644 --- a/libafl_qemu/src/modules/usermode/drcov.rs +++ b/libafl_qemu/src/modules/usermode/drcov.rs @@ -100,7 +100,7 @@ where ); } - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { @@ -124,6 +124,7 @@ where _emulator_modules: &mut EmulatorModules, _input: &S::Input, _observers: &mut OT, + _state: &mut S, _exit_kind: &mut ExitKind, ) where OT: ObserversTuple, diff --git a/libafl_qemu/src/modules/usermode/injections.rs b/libafl_qemu/src/modules/usermode/injections.rs index 67e4ac253e..58de1ff3fd 100644 --- a/libafl_qemu/src/modules/usermode/injections.rs +++ b/libafl_qemu/src/modules/usermode/injections.rs @@ -267,7 +267,7 @@ where emulator_modules.syscalls(Hook::Function(syscall_hook::)); } - fn first_exec(&mut self, emulator_modules: &mut EmulatorModules) + fn first_exec(&mut self, emulator_modules: &mut EmulatorModules, _state: &mut S) where ET: EmulatorModuleTuple, { diff --git a/libafl_qemu/src/modules/usermode/snapshot.rs b/libafl_qemu/src/modules/usermode/snapshot.rs index 7424766829..da126bca2f 100644 --- a/libafl_qemu/src/modules/usermode/snapshot.rs +++ b/libafl_qemu/src/modules/usermode/snapshot.rs @@ -689,8 +689,12 @@ where emulator_modules.after_syscalls(Hook::Function(trace_mmap_snapshot::)); } - fn pre_exec(&mut self, emulator_modules: &mut EmulatorModules, _input: &S::Input) - where + fn pre_exec( + &mut self, + emulator_modules: &mut EmulatorModules, + _input: &S::Input, + _state: &mut S, + ) where ET: EmulatorModuleTuple, { if self.empty {