diff --git a/fuzzers/backtrace_baby_fuzzers/forkserver_executor/src/main.rs b/fuzzers/backtrace_baby_fuzzers/forkserver_executor/src/main.rs index 1060856beb..f8b4ad1fab 100644 --- a/fuzzers/backtrace_baby_fuzzers/forkserver_executor/src/main.rs +++ b/fuzzers/backtrace_baby_fuzzers/forkserver_executor/src/main.rs @@ -2,7 +2,7 @@ use libafl::{ bolts::{ current_nanos, rands::StdRand, - shmem::{ShMem, ShMemProvider, StdShMemProvider}, + shmem::{ShMem, ShMemProvider}, tuples::tuple_list, AsMutSlice, }, @@ -25,12 +25,22 @@ use libafl::{ }; use std::path::PathBuf; +#[cfg(not(target_vendor = "apple"))] +use libafl::bolts::shmem::StdShMemProvider; +#[cfg(target_vendor = "apple")] +use libafl::bolts::shmem::UnixShMemProvider; + #[allow(clippy::similar_names)] pub fn main() { const MAP_SIZE: usize = 65536; //Coverage map shared between observer and executor + #[cfg(target_vendor = "apple")] + let mut shmem_provider = UnixShMemProvider::new().unwrap(); + + #[cfg(not(target_vendor = "apple"))] let mut shmem_provider = StdShMemProvider::new().unwrap(); + let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); //let the forkserver know the shmid shmem.write_to_env("__AFL_SHM_ID").unwrap(); @@ -87,7 +97,7 @@ pub fn main() { let mut fuzzer = StdFuzzer::new(scheduler, feedback, objective); let mut executor = ForkserverExecutor::builder() - .program("./target/release/program".to_string()) + .program("./target/release/program") .arg_input_file_std() .shmem_provider(&mut shmem_provider) .build(tuple_list!(bt_observer, edges_observer)) diff --git a/fuzzers/forkserver_simple/src/main.rs b/fuzzers/forkserver_simple/src/main.rs index e72f23d655..48e0c4007c 100644 --- a/fuzzers/forkserver_simple/src/main.rs +++ b/fuzzers/forkserver_simple/src/main.rs @@ -4,7 +4,7 @@ use libafl::{ bolts::{ current_nanos, rands::StdRand, - shmem::{ShMem, ShMemProvider, StdShMemProvider}, + shmem::{ShMem, ShMemProvider}, tuples::{tuple_list, Merge}, AsMutSlice, }, @@ -25,6 +25,12 @@ use libafl::{ use nix::sys::signal::Signal; use std::path::PathBuf; +#[cfg(target_vendor = "apple")] +use libafl::bolts::shmem::UnixShMemProvider; + +#[cfg(not(target_vendor = "apple"))] +use libafl::bolts::shmem::StdShMemProvider; + #[allow(clippy::similar_names)] pub fn main() { let res = App::new("forkserver_simple") @@ -74,7 +80,12 @@ pub fn main() { const MAP_SIZE: usize = 65536; // The default, OS-specific privider for shared memory + #[cfg(target_vendor = "apple")] + let mut shmem_provider = UnixShMemProvider::new().unwrap(); + + #[cfg(not(target_vendor = "apple"))] let mut shmem_provider = StdShMemProvider::new().unwrap(); + // The coverage map shared between observer and executor let mut shmem = shmem_provider.new_shmem(MAP_SIZE).unwrap(); // let the forkserver know the shmid diff --git a/libafl/src/executors/forkserver.rs b/libafl/src/executors/forkserver.rs index eb6da0f01a..a74566742b 100644 --- a/libafl/src/executors/forkserver.rs +++ b/libafl/src/executors/forkserver.rs @@ -678,6 +678,44 @@ impl<'a, SP> ForkserverExecutorBuilder<'a, SP> { has_asan_observer: None, // initialized on first use }) } + + /// Use autodict? + #[must_use] + pub fn autotokens(mut self, tokens: &'a mut Tokens) -> Self { + self.autotokens = Some(tokens); + self + } + + #[must_use] + /// Parse afl style command line + pub fn parse_afl_cmdline(mut self, args: IT) -> Self + where + IT: IntoIterator, + O: AsRef, + { + let mut res = vec![]; + let mut use_stdin = true; + + for item in args { + if item.as_ref() == "@@" && use_stdin { + use_stdin = false; + res.push(OsString::from(".cur_input")); + } else if let Some(name) = &self.out_filename { + if name == item.as_ref() && use_stdin { + use_stdin = false; + res.push(name.clone()); + } else { + res.push(item.as_ref().to_os_string()); + } + } else { + res.push(item.as_ref().to_os_string()); + } + } + + self.arguments = res; + self.use_stdin = use_stdin; + self + } } impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> { @@ -777,37 +815,6 @@ impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> { self.arg_input_file(OUTFILE_STD) } - #[must_use] - /// Parse afl style command line - pub fn parse_afl_cmdline(mut self, args: IT) -> Self - where - IT: IntoIterator, - O: AsRef, - { - let mut res = vec![]; - let mut use_stdin = true; - - for item in args { - if item.as_ref() == "@@" && use_stdin { - use_stdin = false; - res.push(OsString::from(".cur_input")); - } else if let Some(name) = &self.out_filename { - if name == item.as_ref() && use_stdin { - use_stdin = false; - res.push(name.clone()); - } else { - res.push(item.as_ref().to_os_string()); - } - } else { - res.push(item.as_ref().to_os_string()); - } - } - - self.arguments = res; - self.use_stdin = use_stdin; - self - } - #[must_use] /// If `debug_child` is set, the child will print to `stdout`/`stderr`. pub fn debug_child(mut self, debug_child: bool) -> Self { @@ -815,13 +822,6 @@ impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> { self } - /// Use autodict? - #[must_use] - pub fn autotokens(mut self, tokens: &'a mut Tokens) -> Self { - self.autotokens = Some(tokens); - self - } - /// Shmem provider for forkserver's shared memory testcase feature. pub fn shmem_provider( self,