Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions crates/libafl/src/executors/hooks/inprocess.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,9 @@ impl<I, S> HasTimeout for InProcessHooks<I, S> {
null_mut(),
);
}
let elapsed = cur_time - self.timer().tmout_start_time;
let elapsed = cur_time
.checked_sub(self.timer().tmout_start_time)
.unwrap_or_default();
// set timer the next exec
if self.timer().executions > 0 {
self.timer_mut().avg_exec_time = elapsed / self.timer().executions;
Expand All @@ -165,7 +167,9 @@ impl<I, S> HasTimeout for InProcessHooks<I, S> {
return true;
}

let elapsed_run = cur_time - self.timer_mut().start_time;
let elapsed_run = cur_time
.checked_sub(self.timer_mut().start_time)
.unwrap_or_default();
if elapsed_run < self.timer_mut().exec_tmout {
// fp, reset timeout
unsafe {
Expand All @@ -177,7 +181,9 @@ impl<I, S> HasTimeout for InProcessHooks<I, S> {
);
}
if self.timer().executions > 0 {
let elapsed = cur_time - self.timer_mut().tmout_start_time;
let elapsed = cur_time
.checked_sub(self.timer_mut().tmout_start_time)
.unwrap_or_default();
self.timer_mut().avg_exec_time = elapsed / self.timer().executions;
self.timer_mut().executions = 0; // It will be 1 when the exec finish
}
Expand Down
142 changes: 70 additions & 72 deletions crates/libafl/src/observers/stdio.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,91 +87,89 @@ use crate::{Error, observers::Observer};
/// }
/// }
///
/// fn main() {
/// let input_text = "Hello, World!";
/// let encoded_input_text = "SGVsbG8sIFdvcmxkIQo=";
/// let input_text = "Hello, World!";
/// let encoded_input_text = "SGVsbG8sIFdvcmxkIQo=";
///
/// let stdout_observer = StdOutObserver::new("stdout-observer".into()).unwrap();
/// let stderr_observer = StdErrObserver::new("stderr-observer".into()).unwrap();
/// let stdout_observer = StdOutObserver::new("stdout-observer".into()).unwrap();
/// let stderr_observer = StdErrObserver::new("stderr-observer".into()).unwrap();
///
/// let mut feedback = ExportStdXObserver {
/// stdout_observer: stdout_observer.handle(),
/// stderr_observer: stderr_observer.handle(),
/// };
/// let mut feedback = ExportStdXObserver {
/// stdout_observer: stdout_observer.handle(),
/// stderr_observer: stderr_observer.handle(),
/// };
///
/// let mut objective = ();
/// let mut objective = ();
///
/// let mut executor = CommandExecutor::builder()
/// .program("base64")
/// .arg("--decode")
/// .stdout_observer(stdout_observer.handle())
/// .stderr_observer(stderr_observer.handle())
/// .build(tuple_list!(stdout_observer, stderr_observer))
/// .unwrap();
/// let mut executor = CommandExecutor::builder()
/// .program("base64")
/// .arg("--decode")
/// .stdout_observer(stdout_observer.handle())
/// .stderr_observer(stderr_observer.handle())
/// .build(tuple_list!(stdout_observer, stderr_observer))
/// .unwrap();
///
/// let mut state = StdState::new(
/// StdRand::with_seed(current_nanos()),
/// InMemoryCorpus::new(),
/// InMemoryCorpus::new(),
/// &mut feedback,
/// &mut objective,
/// )
/// .unwrap();
/// let mut state = StdState::new(
/// StdRand::with_seed(current_nanos()),
/// InMemoryCorpus::new(),
/// InMemoryCorpus::new(),
/// &mut feedback,
/// &mut objective,
/// )
/// .unwrap();
///
/// let scheduler = QueueScheduler::new();
/// let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
/// let mut manager = NopEventManager::new();
/// let scheduler = QueueScheduler::new();
/// let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective);
/// let mut manager = NopEventManager::new();
///
/// let mut stages = tuple_list!(StdMutationalStage::new(NopMutator::new(
/// MutationResult::Mutated
/// )));
/// let mut stages = tuple_list!(StdMutationalStage::new(NopMutator::new(
/// MutationResult::Mutated
/// )));
///
/// state
/// .corpus_mut()
/// .add(Testcase::new(BytesInput::from(
/// encoded_input_text.as_bytes().to_vec(),
/// )))
/// .unwrap();
/// state
/// .corpus_mut()
/// .add(Testcase::new(BytesInput::from(
/// encoded_input_text.as_bytes().to_vec(),
/// )))
/// .unwrap();
///
/// let corpus_id = fuzzer
/// .fuzz_one(&mut stages, &mut executor, &mut state, &mut manager)
/// .unwrap();
/// let corpus_id = fuzzer
/// .fuzz_one(&mut stages, &mut executor, &mut state, &mut manager)
/// .unwrap();
///
/// unsafe {
/// assert!(
/// input_text
/// .as_bytes()
/// .iter()
/// .zip(
/// (&*(&raw const STDOUT))
/// .as_ref()
/// .unwrap()
/// .iter()
/// .filter(|e| **e != 10)
/// ) // ignore newline chars
/// .all(|(&a, &b)| a == b)
/// );
/// assert!((&*(&raw const STDERR)).as_ref().unwrap().is_empty());
/// }
/// unsafe {
/// assert!(
/// input_text
/// .as_bytes()
/// .iter()
/// .zip(
/// (&*(&raw const STDOUT))
/// .as_ref()
/// .unwrap()
/// .iter()
/// .filter(|e| **e != 10)
/// ) // ignore newline chars
/// .all(|(&a, &b)| a == b)
/// );
/// assert!((&*(&raw const STDERR)).as_ref().unwrap().is_empty());
/// }
///
/// state
/// .corpus()
/// .get(corpus_id)
/// .unwrap()
/// .replace(Testcase::new(BytesInput::from(
/// encoded_input_text.bytes().skip(1).collect::<Vec<u8>>(), // skip one char to make it invalid code
/// )));
/// state
/// .corpus()
/// .get(corpus_id)
/// .unwrap()
/// .replace(Testcase::new(BytesInput::from(
/// encoded_input_text.bytes().skip(1).collect::<Vec<u8>>(), // skip one char to make it invalid code
/// )));
///
/// fuzzer
/// .fuzz_one(&mut stages, &mut executor, &mut state, &mut manager)
/// .unwrap();
/// fuzzer
/// .fuzz_one(&mut stages, &mut executor, &mut state, &mut manager)
/// .unwrap();
///
/// unsafe {
/// let compare_vec: Vec<u8> = Vec::new();
/// assert_eq!(compare_vec, *(&*(&raw const STDERR)).clone().unwrap());
/// // stdout will still contain data, we're just checking that there is an error message
/// }
/// }
/// unsafe {
/// let compare_vec: Vec<u8> = Vec::new();
/// assert_eq!(compare_vec, *(&*(&raw const STDERR)).clone().unwrap());
/// // stdout will still contain data, we're just checking that there is an error message
/// }
/// ```
///
#[derive(Debug, Serialize, Deserialize)]
Expand Down
Loading