diff --git a/src/agent/onefuzz-task/src/local/libfuzzer.rs b/src/agent/onefuzz-task/src/local/libfuzzer.rs index c81d31489..4be49cb2f 100644 --- a/src/agent/onefuzz-task/src/local/libfuzzer.rs +++ b/src/agent/onefuzz-task/src/local/libfuzzer.rs @@ -16,8 +16,8 @@ use crate::{ }, tasks::{ analysis::generic::run as run_analysis, config::CommonConfig, - fuzz::libfuzzer_fuzz::LibFuzzerFuzzTask, regression::libfuzzer::LibFuzzerRegressionTask, - report::libfuzzer_report::ReportTask, + fuzz::libfuzzer::generic::LibFuzzerFuzzTask, + regression::libfuzzer::LibFuzzerRegressionTask, report::libfuzzer_report::ReportTask, }, }; #[cfg(any(target_os = "linux", target_os = "windows"))] diff --git a/src/agent/onefuzz-task/src/local/libfuzzer_fuzz.rs b/src/agent/onefuzz-task/src/local/libfuzzer_fuzz.rs index 3caabd73c..25dd42738 100644 --- a/src/agent/onefuzz-task/src/local/libfuzzer_fuzz.rs +++ b/src/agent/onefuzz-task/src/local/libfuzzer_fuzz.rs @@ -9,7 +9,7 @@ use crate::{ }, tasks::{ config::CommonConfig, - fuzz::libfuzzer_fuzz::{Config, LibFuzzerFuzzTask}, + fuzz::libfuzzer::generic::{Config, LibFuzzerFuzzTask}, }, }; use anyhow::Result; @@ -51,6 +51,7 @@ pub fn build_fuzz_config( check_fuzzer_help, expect_crash_on_failure, common, + extra: (), }; Ok(config) diff --git a/src/agent/onefuzz-task/src/tasks/config.rs b/src/agent/onefuzz-task/src/tasks/config.rs index c88b655be..00e1c26b4 100644 --- a/src/agent/onefuzz-task/src/tasks/config.rs +++ b/src/agent/onefuzz-task/src/tasks/config.rs @@ -88,7 +88,7 @@ pub enum Config { DotnetCoverage(coverage::dotnet::Config), #[serde(alias = "libfuzzer_fuzz")] - LibFuzzerFuzz(fuzz::libfuzzer_fuzz::Config), + LibFuzzerFuzz(fuzz::libfuzzer::generic::Config), #[serde(alias = "libfuzzer_crash_report")] LibFuzzerReport(report::libfuzzer_report::Config), @@ -225,7 +225,7 @@ impl Config { .await } Config::LibFuzzerFuzz(config) => { - fuzz::libfuzzer_fuzz::LibFuzzerFuzzTask::new(config)? + fuzz::libfuzzer::generic::LibFuzzerFuzzTask::new(config)? .run() .await } diff --git a/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer.rs b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer.rs new file mode 100644 index 000000000..91d9d65ff --- /dev/null +++ b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer.rs @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +pub mod common; +pub mod generic; diff --git a/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer_fuzz.rs b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/common.rs similarity index 94% rename from src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer_fuzz.rs rename to src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/common.rs index 59523666a..7d2248251 100644 --- a/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer_fuzz.rs +++ b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/common.rs @@ -40,8 +40,20 @@ pub fn default_workers() -> usize { usize::max(1, cpus - 1) } +/// LibFuzzer subtypes that share custom configuration or process initialization. +pub trait LibFuzzerType { + /// Extra configuration values expected by the `Config` for this type. + type Config; + + /// Method that constructs a `LibFuzzer` configured as appropriate for the subtype. + /// + /// This may include things like setting special environment variables, or overriding + /// the defaults or values of some command arguments. + fn from_config(config: &Config) -> LibFuzzer; +} + #[derive(Debug, Deserialize, Clone)] -pub struct Config { +pub struct Config { pub inputs: SyncedDir, pub readonly_inputs: Option>, pub crashes: SyncedDir, @@ -61,14 +73,23 @@ pub struct Config { #[serde(flatten)] pub common: CommonConfig, + + #[serde(flatten)] + pub extra: L::Config, } -pub struct LibFuzzerFuzzTask { - config: Config, +pub struct LibFuzzerFuzzTask +where + L: LibFuzzerType, +{ + config: Config, } -impl LibFuzzerFuzzTask { - pub fn new(config: Config) -> Result { +impl LibFuzzerFuzzTask +where + L: LibFuzzerType, +{ + pub fn new(config: Config) -> Result { Ok(Self { config }) } @@ -108,12 +129,8 @@ impl LibFuzzerFuzzTask { directories.append(&mut dirs); } - let fuzzer = LibFuzzer::new( - &self.config.target_exe, - &self.config.target_options, - &self.config.target_env, - &self.config.common.setup_dir, - ); + let fuzzer = L::from_config(&self.config); + fuzzer .verify(self.config.check_fuzzer_help, Some(directories)) .await diff --git a/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/generic.rs b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/generic.rs new file mode 100644 index 000000000..d3e5bc70a --- /dev/null +++ b/src/agent/onefuzz-task/src/tasks/fuzz/libfuzzer/generic.rs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +use onefuzz::libfuzzer::LibFuzzer; + +use crate::tasks::fuzz::libfuzzer::common; + +/// Generic LibFuzzer with no special extra configuration. +/// +/// Its configuration is fully controlled by the user, up to the constraints of the +/// `LibFuzzer` wrapper itself. +#[derive(Debug)] +pub struct GenericLibFuzzer; + +impl common::LibFuzzerType for GenericLibFuzzer { + type Config = (); + + fn from_config(config: &common::Config) -> LibFuzzer { + LibFuzzer::new( + &config.target_exe, + &config.target_options, + &config.target_env, + &config.common.setup_dir, + ) + } +} + +pub type Config = common::Config; +pub type LibFuzzerFuzzTask = common::LibFuzzerFuzzTask; diff --git a/src/agent/onefuzz-task/src/tasks/fuzz/mod.rs b/src/agent/onefuzz-task/src/tasks/fuzz/mod.rs index 06bdcc726..0caae5dad 100644 --- a/src/agent/onefuzz-task/src/tasks/fuzz/mod.rs +++ b/src/agent/onefuzz-task/src/tasks/fuzz/mod.rs @@ -2,5 +2,5 @@ // Licensed under the MIT License. pub mod generator; -pub mod libfuzzer_fuzz; +pub mod libfuzzer; pub mod supervisor;