Set persistent mode env variables. (#852)

* persistnt mode envs

* clp

* clpgit add -u!
This commit is contained in:
Dongjia "toka" Zhang 2022-10-24 03:35:35 +09:00 committed by GitHub
parent 0307dadcd1
commit 5b75b6b8ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -170,8 +170,10 @@ pub struct Forkserver {
last_run_timed_out: i32, last_run_timed_out: i32,
} }
#[allow(clippy::fn_params_excessive_bools)]
impl Forkserver { impl Forkserver {
/// Create a new [`Forkserver`] /// Create a new [`Forkserver`]
#[allow(clippy::too_many_arguments)]
pub fn new( pub fn new(
target: OsString, target: OsString,
args: Vec<OsString>, args: Vec<OsString>,
@ -179,6 +181,8 @@ impl Forkserver {
input_filefd: RawFd, input_filefd: RawFd,
use_stdin: bool, use_stdin: bool,
memlimit: u64, memlimit: u64,
is_persistent: bool,
is_deferred_frksrv: bool,
debug_output: bool, debug_output: bool,
) -> Result<Self, Error> { ) -> Result<Self, Error> {
let mut st_pipe = Pipe::new().unwrap(); let mut st_pipe = Pipe::new().unwrap();
@ -190,12 +194,26 @@ impl Forkserver {
(Stdio::null(), Stdio::null()) (Stdio::null(), Stdio::null())
}; };
match Command::new(target) let mut command = Command::new(target);
// Setup args, stdio
command
.args(args) .args(args)
.stdin(Stdio::null()) .stdin(Stdio::null())
.stdout(stdout) .stdout(stdout)
.stderr(stderr) .stderr(stderr);
.env("LD_BIND_LAZY", "1")
// Persistent, deferred forkserver
if is_persistent {
command.env("__AFL_PERSISTENT", "1");
}
if is_deferred_frksrv {
command.env("__AFL_DEFER_FORKSRV", "1");
}
match command
.env("LD_BIND_NOW", "1")
.env("ASAN_OPTIONS", get_asan_runtime_flags_with_log_path()) .env("ASAN_OPTIONS", get_asan_runtime_flags_with_log_path())
.envs(envs) .envs(envs)
.setlimit(memlimit) .setlimit(memlimit)
@ -543,12 +561,15 @@ where
/// The builder for `ForkserverExecutor` /// The builder for `ForkserverExecutor`
#[derive(Debug)] #[derive(Debug)]
#[allow(clippy::struct_excessive_bools)]
pub struct ForkserverExecutorBuilder<'a, SP> { pub struct ForkserverExecutorBuilder<'a, SP> {
program: Option<OsString>, program: Option<OsString>,
arguments: Vec<OsString>, arguments: Vec<OsString>,
envs: Vec<(OsString, OsString)>, envs: Vec<(OsString, OsString)>,
debug_child: bool, debug_child: bool,
use_stdin: bool, use_stdin: bool,
is_persistent: bool,
is_deferred_frksrv: bool,
autotokens: Option<&'a mut Tokens>, autotokens: Option<&'a mut Tokens>,
input_filename: Option<OsString>, input_filename: Option<OsString>,
shmem_provider: Option<&'a mut SP>, shmem_provider: Option<&'a mut SP>,
@ -595,6 +616,8 @@ impl<'a, SP> ForkserverExecutorBuilder<'a, SP> {
input_file.as_raw_fd(), input_file.as_raw_fd(),
self.use_stdin, self.use_stdin,
0, 0,
self.is_persistent,
self.is_deferred_frksrv,
self.debug_child, self.debug_child,
)?; )?;
@ -740,6 +763,8 @@ impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> {
envs: vec![], envs: vec![],
debug_child: false, debug_child: false,
use_stdin: true, use_stdin: true,
is_persistent: false,
is_deferred_frksrv: false,
autotokens: None, autotokens: None,
input_filename: None, input_filename: None,
shmem_provider: None, shmem_provider: None,
@ -830,6 +855,20 @@ impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> {
self self
} }
#[must_use]
/// Call this if you want to run it under persistent mode; default is false
pub fn is_persistent(mut self, is_persistent: bool) -> Self {
self.is_persistent = is_persistent;
self
}
#[must_use]
/// Call this if the harness uses deferred forkserver mode; default is false
pub fn is_deferred_frksrv(mut self, is_deferred_frksrv: bool) -> Self {
self.is_deferred_frksrv = is_deferred_frksrv;
self
}
/// Shmem provider for forkserver's shared memory testcase feature. /// Shmem provider for forkserver's shared memory testcase feature.
pub fn shmem_provider<SP: ShMemProvider>( pub fn shmem_provider<SP: ShMemProvider>(
self, self,
@ -841,6 +880,8 @@ impl<'a> ForkserverExecutorBuilder<'a, StdShMemProvider> {
envs: self.envs, envs: self.envs,
debug_child: self.debug_child, debug_child: self.debug_child,
use_stdin: self.use_stdin, use_stdin: self.use_stdin,
is_persistent: self.is_persistent,
is_deferred_frksrv: self.is_deferred_frksrv,
autotokens: self.autotokens, autotokens: self.autotokens,
input_filename: self.input_filename, input_filename: self.input_filename,
shmem_provider: Some(shmem_provider), shmem_provider: Some(shmem_provider),