remove timeout on crash (#224)
This commit is contained in:
parent
42b7c6d7e7
commit
ec4c5ae88a
@ -275,6 +275,7 @@ mod unix_signal_handler {
|
||||
events::{Event, EventFirer, EventRestarter},
|
||||
executors::{
|
||||
inprocess::{InProcessExecutorHandlerData, GLOBAL_STATE},
|
||||
timeout::remove_timeout,
|
||||
ExitKind,
|
||||
},
|
||||
feedbacks::Feedback,
|
||||
@ -422,6 +423,8 @@ mod unix_signal_handler {
|
||||
I: Input,
|
||||
Z: HasObjective<I, OF, S>,
|
||||
{
|
||||
remove_timeout();
|
||||
|
||||
#[cfg(all(target_os = "android", target_arch = "aarch64"))]
|
||||
let _context = *(((_context as *mut _ as *mut c_void as usize) + 128) as *mut c_void
|
||||
as *mut ucontext_t);
|
||||
|
@ -11,7 +11,7 @@ use crate::{
|
||||
};
|
||||
|
||||
#[cfg(unix)]
|
||||
use core::ptr::null_mut;
|
||||
use core::{mem::zeroed, ptr::null_mut};
|
||||
#[cfg(unix)]
|
||||
use libc::c_int;
|
||||
|
||||
@ -37,13 +37,24 @@ extern "C" {
|
||||
#[cfg(unix)]
|
||||
const ITIMER_REAL: c_int = 0;
|
||||
|
||||
/// Reset and remove the timeout
|
||||
pub fn remove_timeout() {
|
||||
#[cfg(unix)]
|
||||
unsafe {
|
||||
let mut itimerval_zero: Itimerval = zeroed();
|
||||
setitimer(ITIMER_REAL, &mut itimerval_zero, null_mut());
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
||||
/// The timeout excutor is a wrapper that sets a timeout before each run
|
||||
pub struct TimeoutExecutor<E> {
|
||||
executor: E,
|
||||
#[cfg(unix)]
|
||||
itimerval: Itimerval,
|
||||
#[cfg(unix)]
|
||||
itimerval_zero: Itimerval,
|
||||
}
|
||||
|
||||
impl<E> TimeoutExecutor<E> {
|
||||
@ -52,34 +63,21 @@ impl<E> TimeoutExecutor<E> {
|
||||
#[cfg(unix)]
|
||||
pub fn new(executor: E, exec_tmout: Duration) -> Self {
|
||||
let milli_sec = exec_tmout.as_millis();
|
||||
let it_value_some = Timeval {
|
||||
let it_value = Timeval {
|
||||
tv_sec: (milli_sec / 1000) as i64,
|
||||
tv_usec: (milli_sec % 1000) as i64,
|
||||
};
|
||||
let it_value_zero = Timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
let it_interval_some = Timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
let it_interval_zero = Timeval {
|
||||
let it_interval = Timeval {
|
||||
tv_sec: 0,
|
||||
tv_usec: 0,
|
||||
};
|
||||
let itimerval = Itimerval {
|
||||
it_value: it_value_some,
|
||||
it_interval: it_interval_some,
|
||||
};
|
||||
let itimerval_zero = Itimerval {
|
||||
it_value: it_value_zero,
|
||||
it_interval: it_interval_zero,
|
||||
it_value: it_value,
|
||||
it_interval: it_interval,
|
||||
};
|
||||
Self {
|
||||
executor,
|
||||
itimerval,
|
||||
itimerval_zero,
|
||||
}
|
||||
}
|
||||
|
||||
@ -116,16 +114,7 @@ where
|
||||
}
|
||||
|
||||
let ret = self.executor.run_target(fuzzer, state, mgr, input);
|
||||
|
||||
#[cfg(unix)]
|
||||
unsafe {
|
||||
setitimer(ITIMER_REAL, &mut self.itimerval_zero, null_mut());
|
||||
}
|
||||
#[cfg(windows)]
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
||||
remove_timeout();
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user