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}, events::{Event, EventFirer, EventRestarter},
executors::{ executors::{
inprocess::{InProcessExecutorHandlerData, GLOBAL_STATE}, inprocess::{InProcessExecutorHandlerData, GLOBAL_STATE},
timeout::remove_timeout,
ExitKind, ExitKind,
}, },
feedbacks::Feedback, feedbacks::Feedback,
@ -422,6 +423,8 @@ mod unix_signal_handler {
I: Input, I: Input,
Z: HasObjective<I, OF, S>, Z: HasObjective<I, OF, S>,
{ {
remove_timeout();
#[cfg(all(target_os = "android", target_arch = "aarch64"))] #[cfg(all(target_os = "android", target_arch = "aarch64"))]
let _context = *(((_context as *mut _ as *mut c_void as usize) + 128) as *mut c_void let _context = *(((_context as *mut _ as *mut c_void as usize) + 128) as *mut c_void
as *mut ucontext_t); as *mut ucontext_t);

View File

@ -11,7 +11,7 @@ use crate::{
}; };
#[cfg(unix)] #[cfg(unix)]
use core::ptr::null_mut; use core::{mem::zeroed, ptr::null_mut};
#[cfg(unix)] #[cfg(unix)]
use libc::c_int; use libc::c_int;
@ -37,13 +37,24 @@ extern "C" {
#[cfg(unix)] #[cfg(unix)]
const ITIMER_REAL: c_int = 0; 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 /// The timeout excutor is a wrapper that sets a timeout before each run
pub struct TimeoutExecutor<E> { pub struct TimeoutExecutor<E> {
executor: E, executor: E,
#[cfg(unix)] #[cfg(unix)]
itimerval: Itimerval, itimerval: Itimerval,
#[cfg(unix)]
itimerval_zero: Itimerval,
} }
impl<E> TimeoutExecutor<E> { impl<E> TimeoutExecutor<E> {
@ -52,34 +63,21 @@ impl<E> TimeoutExecutor<E> {
#[cfg(unix)] #[cfg(unix)]
pub fn new(executor: E, exec_tmout: Duration) -> Self { pub fn new(executor: E, exec_tmout: Duration) -> Self {
let milli_sec = exec_tmout.as_millis(); let milli_sec = exec_tmout.as_millis();
let it_value_some = Timeval { let it_value = Timeval {
tv_sec: (milli_sec / 1000) as i64, tv_sec: (milli_sec / 1000) as i64,
tv_usec: (milli_sec % 1000) as i64, tv_usec: (milli_sec % 1000) as i64,
}; };
let it_value_zero = Timeval { let it_interval = Timeval {
tv_sec: 0,
tv_usec: 0,
};
let it_interval_some = Timeval {
tv_sec: 0,
tv_usec: 0,
};
let it_interval_zero = Timeval {
tv_sec: 0, tv_sec: 0,
tv_usec: 0, tv_usec: 0,
}; };
let itimerval = Itimerval { let itimerval = Itimerval {
it_value: it_value_some, it_value: it_value,
it_interval: it_interval_some, it_interval: it_interval,
};
let itimerval_zero = Itimerval {
it_value: it_value_zero,
it_interval: it_interval_zero,
}; };
Self { Self {
executor, executor,
itimerval, itimerval,
itimerval_zero,
} }
} }
@ -116,16 +114,7 @@ where
} }
let ret = self.executor.run_target(fuzzer, state, mgr, input); let ret = self.executor.run_target(fuzzer, state, mgr, input);
remove_timeout();
#[cfg(unix)]
unsafe {
setitimer(ITIMER_REAL, &mut self.itimerval_zero, null_mut());
}
#[cfg(windows)]
{
// TODO
}
ret ret
} }
} }