Improve TimeoutExecutor (#126)

* improve TimeoutExecutor

* fix for windows build
This commit is contained in:
Toka 2021-05-26 05:20:52 +09:00 committed by GitHub
parent a0804fd24d
commit 5d44846c27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -39,19 +39,54 @@ const ITIMER_REAL: c_int = 0;
/// The timeout excutor is a wrapper that set a timeout before each run /// The timeout excutor is a wrapper that set a timeout before each run
pub struct TimeoutExecutor<E> { pub struct TimeoutExecutor<E> {
executor: E, executor: E,
exec_tmout: Duration, #[cfg(unix)]
itimerval: Itimerval,
#[cfg(unix)]
itimerval_zero: Itimerval,
} }
impl<E> TimeoutExecutor<E> { impl<E> TimeoutExecutor<E> {
/// Create a new `TimeoutExecutor`, wrapping the given `executor` and checking for timeouts. /// Create a new `TimeoutExecutor`, wrapping the given `executor` and checking for timeouts.
/// This should usually be used for `InProcess` fuzzing. /// This should usually be used for `InProcess` fuzzing.
#[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 it_value_some = 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 {
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,
};
Self { Self {
executor, executor,
exec_tmout, itimerval,
itimerval_zero,
} }
} }
#[cfg(windows)]
pub fn new(executor: E, exec_tmout: Duration) -> Self {
Self { executor }
}
/// Retrieve the inner `Executor` that is wrapped by this `TimeoutExecutor`. /// Retrieve the inner `Executor` that is wrapped by this `TimeoutExecutor`.
pub fn inner(&mut self) -> &mut E { pub fn inner(&mut self) -> &mut E {
&mut self.executor &mut self.executor
@ -72,50 +107,18 @@ where
) -> Result<ExitKind, Error> { ) -> Result<ExitKind, Error> {
#[cfg(unix)] #[cfg(unix)]
unsafe { unsafe {
let milli_sec = self.exec_tmout.as_millis(); setitimer(ITIMER_REAL, &mut self.itimerval, null_mut());
let it_value = Timeval {
tv_sec: (milli_sec / 1000) as i64,
tv_usec: (milli_sec % 1000) as i64,
};
let it_interval = Timeval {
tv_sec: 0,
tv_usec: 0,
};
setitimer(
ITIMER_REAL,
&mut Itimerval {
it_interval,
it_value,
},
null_mut(),
);
} }
#[cfg(windows)] #[cfg(windows)]
{ {
// TODO // TODO
let _ = self.exec_tmout.as_millis();
} }
let ret = self.executor.run_target(fuzzer, state, mgr, input); let ret = self.executor.run_target(fuzzer, state, mgr, input);
#[cfg(unix)] #[cfg(unix)]
unsafe { unsafe {
let it_value = Timeval { setitimer(ITIMER_REAL, &mut self.itimerval_zero, null_mut());
tv_sec: 0,
tv_usec: 0,
};
let it_interval = Timeval {
tv_sec: 0,
tv_usec: 0,
};
setitimer(
ITIMER_REAL,
&mut Itimerval {
it_interval,
it_value,
},
null_mut(),
);
} }
#[cfg(windows)] #[cfg(windows)]
{ {