remove timeout on crash (#224)

This commit is contained in:
Andrea Fioraldi 2021-07-13 16:15:12 +02:00 committed by GitHub
parent 42b7c6d7e7
commit ec4c5ae88a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 30 deletions

View File

@ -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);

View File

@ -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
}
}