Use observers to handle crashes in run_target for TimeoutForkserverExecutor (#1189)

Co-authored-by: Dongjia "toka" Zhang <tokazerkje@outlook.com>
This commit is contained in:
Andrey Fedotov 2023-04-04 20:17:48 +03:00 committed by GitHub
parent 1bd21509af
commit 807a534121
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -31,7 +31,7 @@ use crate::{
fs::{get_unique_std_input_file, InputFile}, fs::{get_unique_std_input_file, InputFile},
os::{dup2, pipes::Pipe}, os::{dup2, pipes::Pipe},
shmem::{ShMem, ShMemProvider, UnixShMemProvider}, shmem::{ShMem, ShMemProvider, UnixShMemProvider},
tuples::Prepend, tuples::{MatchName, Prepend},
AsMutSlice, AsSlice, Truncate, AsMutSlice, AsSlice, Truncate,
}, },
executors::{Executor, ExitKind, HasObservers}, executors::{Executor, ExitKind, HasObservers},
@ -418,7 +418,7 @@ impl<E> TimeoutForkserverExecutor<E> {
impl<E, EM, Z> Executor<EM, Z> for TimeoutForkserverExecutor<E> impl<E, EM, Z> Executor<EM, Z> for TimeoutForkserverExecutor<E>
where where
E: Executor<EM, Z> + HasForkserver + Debug, E: Executor<EM, Z> + HasForkserver + HasObservers + Debug,
E::Input: HasTargetBytes, E::Input: HasTargetBytes,
EM: UsesState<State = E::State>, EM: UsesState<State = E::State>,
Z: UsesState<State = E::State>, Z: UsesState<State = E::State>,
@ -488,6 +488,13 @@ where
self.executor.forkserver_mut().set_status(status); self.executor.forkserver_mut().set_status(status);
if libc::WIFSIGNALED(self.executor.forkserver().status()) { if libc::WIFSIGNALED(self.executor.forkserver().status()) {
exit_kind = ExitKind::Crash; exit_kind = ExitKind::Crash;
#[cfg(feature = "regex")]
if let Some(asan_observer) = self
.observers_mut()
.match_name_mut::<AsanBacktraceObserver>("AsanBacktraceObserver")
{
asan_observer.parse_asan_output_from_asan_log_file(pid)?;
}
} }
} else { } else {
self.executor.forkserver_mut().set_last_run_timed_out(1); self.executor.forkserver_mut().set_last_run_timed_out(1);