diff --git a/libafl/src/executors/forkserver.rs b/libafl/src/executors/forkserver.rs index f80d8eac8c..5ec9f7f3f7 100644 --- a/libafl/src/executors/forkserver.rs +++ b/libafl/src/executors/forkserver.rs @@ -378,14 +378,25 @@ pub trait HasForkserver { pub struct TimeoutForkserverExecutor { executor: E, timeout: TimeSpec, + signal: Signal, } impl TimeoutForkserverExecutor { /// Create a new [`TimeoutForkserverExecutor`] pub fn new(executor: E, exec_tmout: Duration) -> Result { + let signal = Signal::SIGKILL; + Self::with_signal(executor, exec_tmout, signal) + } + + /// Create a new [`TimeoutForkserverExecutor`] that sends a user-defined signal to the timed-out process + pub fn with_signal(executor: E, exec_tmout: Duration, signal: Signal) -> Result { let milli_sec = exec_tmout.as_millis() as i64; let timeout = TimeSpec::milliseconds(milli_sec); - Ok(Self { executor, timeout }) + Ok(Self { + executor, + timeout, + signal, + }) } } @@ -466,7 +477,7 @@ where self.executor.forkserver_mut().set_last_run_timed_out(1); // We need to kill the child in case he has timed out, or we can't get the correct pid in the next call to self.executor.forkserver_mut().read_st()? - let _ = kill(self.executor.forkserver().child_pid(), Signal::SIGKILL); + let _ = kill(self.executor.forkserver().child_pid(), self.signal); let (recv_status_len, _) = self.executor.forkserver_mut().read_st()?; if recv_status_len != 4 { return Err(Error::Forkserver(