From c8862c7f1846a65613156943b0f63e261e30e06f Mon Sep 17 00:00:00 2001 From: bmc-msft <41130664+bmc-msft@users.noreply.github.com> Date: Fri, 18 Jun 2021 11:40:36 -0400 Subject: [PATCH] add cooloff period for rapidly exiting libFuzzer targets (#1002) --- .../src/tasks/fuzz/libfuzzer_fuzz.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/agent/onefuzz-agent/src/tasks/fuzz/libfuzzer_fuzz.rs b/src/agent/onefuzz-agent/src/tasks/fuzz/libfuzzer_fuzz.rs index b3bb864885..cefc347277 100644 --- a/src/agent/onefuzz-agent/src/tasks/fuzz/libfuzzer_fuzz.rs +++ b/src/agent/onefuzz-agent/src/tasks/fuzz/libfuzzer_fuzz.rs @@ -24,7 +24,7 @@ use tokio::{ select, sync::{mpsc, Notify}, task, - time::{sleep, Duration}, + time::{sleep, Duration, Instant}, }; use uuid::Uuid; @@ -37,6 +37,9 @@ const PROC_INFO_PERIOD: Duration = Duration::from_secs(30); // Period of reporting fuzzer-generated runtime stats. const RUNTIME_STATS_PERIOD: Duration = Duration::from_secs(60); +// Period for minimum duration between launches of libFuzzer +const COOLOFF_PERIOD: Duration = Duration::from_secs(10); + /// Maximum number of log message to safe in case of libFuzzer failing, /// arbitrarily chosen const LOGS_BUFFER_SIZE: usize = 1024; @@ -160,6 +163,7 @@ impl LibFuzzerFuzzTask { ) -> Result<()> { let local_input_dir = self.create_local_temp_dir().await?; loop { + let instant = Instant::now(); self.run_fuzzer(&local_input_dir.path(), worker_id, stats_sender) .await?; @@ -181,6 +185,13 @@ impl LibFuzzerFuzzTask { ) })?; } + + // if libFuzzer is exiting rapidly, give some breathing room to allow the + // handles to be reaped. + let runtime = instant.elapsed(); + if runtime < COOLOFF_PERIOD { + sleep(COOLOFF_PERIOD - runtime).await; + } } } @@ -335,7 +346,7 @@ async fn report_fuzzer_sys_info( ) -> Result<()> { // Allow for sampling CPU usage. let mut period = tokio::time::interval_at( - tokio::time::Instant::now() + PROC_INFO_COLLECTION_DELAY, + Instant::now() + PROC_INFO_COLLECTION_DELAY, PROC_INFO_PERIOD, ); loop {