mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-17 20:38:06 +00:00
limit the amount of data recorded from libFuzzer's stderr (#785)
This commit is contained in:
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
use crate::tasks::{config::CommonConfig, heartbeat::HeartbeatSender, utils::default_bool_true};
|
use crate::tasks::{config::CommonConfig, heartbeat::HeartbeatSender, utils::default_bool_true};
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
|
use arraydeque::{ArrayDeque, Wrapping};
|
||||||
use futures::{future::try_join_all, stream::StreamExt};
|
use futures::{future::try_join_all, stream::StreamExt};
|
||||||
use onefuzz::{
|
use onefuzz::{
|
||||||
fs::list_files,
|
fs::list_files,
|
||||||
@ -35,6 +36,10 @@ const PROC_INFO_PERIOD: Duration = Duration::from_secs(30);
|
|||||||
// Period of reporting fuzzer-generated runtime stats.
|
// Period of reporting fuzzer-generated runtime stats.
|
||||||
const RUNTIME_STATS_PERIOD: Duration = Duration::from_secs(60);
|
const RUNTIME_STATS_PERIOD: Duration = Duration::from_secs(60);
|
||||||
|
|
||||||
|
/// Maximum number of log message to safe in case of libFuzzer failing,
|
||||||
|
/// arbitrarily chosen
|
||||||
|
const LOGS_BUFFER_SIZE: usize = 1024;
|
||||||
|
|
||||||
pub fn default_workers() -> usize {
|
pub fn default_workers() -> usize {
|
||||||
let cpus = num_cpus::get();
|
let cpus = num_cpus::get();
|
||||||
usize::max(1, cpus - 1)
|
usize::max(1, cpus - 1)
|
||||||
@ -207,7 +212,8 @@ impl LibFuzzerFuzzTask {
|
|||||||
.ok_or_else(|| format_err!("stderr not captured"))?;
|
.ok_or_else(|| format_err!("stderr not captured"))?;
|
||||||
let mut stderr = BufReader::new(stderr);
|
let mut stderr = BufReader::new(stderr);
|
||||||
|
|
||||||
let mut libfuzzer_output = Vec::new();
|
let mut libfuzzer_output: ArrayDeque<[_; LOGS_BUFFER_SIZE], Wrapping> = ArrayDeque::new();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let mut buf = vec![];
|
let mut buf = vec![];
|
||||||
let bytes_read = stderr.read_until(b'\n', &mut buf).await?;
|
let bytes_read = stderr.read_until(b'\n', &mut buf).await?;
|
||||||
@ -220,7 +226,7 @@ impl LibFuzzerFuzzTask {
|
|||||||
error!("could not parse fuzzing interation update: {}", err);
|
error!("could not parse fuzzing interation update: {}", err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
libfuzzer_output.push(line);
|
libfuzzer_output.push_back(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (exit_status, _) = tokio::join!(running, sys_info);
|
let (exit_status, _) = tokio::join!(running, sys_info);
|
||||||
@ -236,13 +242,16 @@ impl LibFuzzerFuzzTask {
|
|||||||
bail!(
|
bail!(
|
||||||
"libfuzzer exited without generating crashes. status:{} stderr:{:?}",
|
"libfuzzer exited without generating crashes. status:{} stderr:{:?}",
|
||||||
serde_json::to_string(&exit_status)?,
|
serde_json::to_string(&exit_status)?,
|
||||||
libfuzzer_output.join("\n")
|
libfuzzer_output
|
||||||
|
.into_iter()
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join("\n")
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
warn!(
|
warn!(
|
||||||
"libfuzzer exited without generating crashes, continuing. status:{} stderr:{:?}",
|
"libfuzzer exited without generating crashes, continuing. status:{} stderr:{:?}",
|
||||||
serde_json::to_string(&exit_status)?,
|
serde_json::to_string(&exit_status)?,
|
||||||
libfuzzer_output.join("\n")
|
libfuzzer_output.into_iter().collect::<Vec<String>>().join("\n")
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user