mirror of
https://github.com/microsoft/onefuzz.git
synced 2025-06-18 04:38:09 +00:00
Address clippy issues (#409)
This commit is contained in:
1
src/agent/Cargo.lock
generated
1
src/agent/Cargo.lock
generated
@ -2104,6 +2104,7 @@ dependencies = [
|
|||||||
"backoff",
|
"backoff",
|
||||||
"log",
|
"log",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -261,8 +261,8 @@ pub struct ModuleImage {
|
|||||||
impl ModuleImage {
|
impl ModuleImage {
|
||||||
pub fn new(map: MemoryMap) -> Result<Self> {
|
pub fn new(map: MemoryMap) -> Result<Self> {
|
||||||
if let MMapPath::Path(..) = &map.pathname {
|
if let MMapPath::Path(..) = &map.pathname {
|
||||||
if map.perms.contains("x") {
|
if map.perms.contains('x') {
|
||||||
return Ok(ModuleImage { map });
|
Ok(ModuleImage { map })
|
||||||
} else {
|
} else {
|
||||||
anyhow::bail!("memory mapping is not executable");
|
anyhow::bail!("memory mapping is not executable");
|
||||||
}
|
}
|
||||||
|
@ -53,8 +53,8 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let sha = run_cmd(&["git", "rev-parse", "HEAD"])?;
|
let sha = run_cmd(&["git", "rev-parse", "HEAD"])?;
|
||||||
|
|
||||||
let hardcode_version = env::var("ONEFUZZ_SET_VERSION");
|
let hardcode_version = env::var("ONEFUZZ_SET_VERSION");
|
||||||
if hardcode_version.is_ok() {
|
if let Ok(hardcode_version) = &hardcode_version {
|
||||||
print_values(hardcode_version.unwrap().as_ref(), &sha);
|
print_values(hardcode_version, &sha);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ pub fn run(args: &clap::ArgMatches) -> Result<()> {
|
|||||||
let mut rt = Runtime::new()?;
|
let mut rt = Runtime::new()?;
|
||||||
rt.block_on(merge_inputs(
|
rt.block_on(merge_inputs(
|
||||||
config.clone(),
|
config.clone(),
|
||||||
vec![config.clone().inputs[0].path.clone()],
|
vec![config.inputs[0].path.clone()],
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -129,7 +129,7 @@ async fn generate_input(
|
|||||||
async fn start_fuzzing<'a>(
|
async fn start_fuzzing<'a>(
|
||||||
config: &GeneratorConfig,
|
config: &GeneratorConfig,
|
||||||
corpus_dirs: Vec<impl AsRef<Path>>,
|
corpus_dirs: Vec<impl AsRef<Path>>,
|
||||||
tester: Tester<'a>,
|
tester: Tester<'_>,
|
||||||
heartbeat_client: Option<TaskHeartbeatClient>,
|
heartbeat_client: Option<TaskHeartbeatClient>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let generator_tmp = "generator_tmp";
|
let generator_tmp = "generator_tmp";
|
||||||
|
@ -270,7 +270,7 @@ mod tests {
|
|||||||
runtime_dir,
|
runtime_dir,
|
||||||
PathBuf::from(afl_fuzz_exe),
|
PathBuf::from(afl_fuzz_exe),
|
||||||
PathBuf::from(afl_test_binary),
|
PathBuf::from(afl_test_binary),
|
||||||
fault_dir.clone(),
|
fault_dir,
|
||||||
corpus_dir,
|
corpus_dir,
|
||||||
&target_options,
|
&target_options,
|
||||||
&supervisor_options,
|
&supervisor_options,
|
||||||
|
@ -122,8 +122,10 @@ async fn test_ready_poll() {
|
|||||||
|
|
||||||
let msg: Msg = 0;
|
let msg: Msg = 0;
|
||||||
|
|
||||||
let mut queue = TestQueue::default();
|
let mut queue = TestQueue {
|
||||||
queue.pending = vec![msg];
|
pending: vec![msg],
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
task.trigger(Event::Poll(&mut queue)).await.unwrap();
|
task.trigger(Event::Poll(&mut queue)).await.unwrap();
|
||||||
|
|
||||||
@ -140,8 +142,9 @@ async fn test_polled_some_parse() {
|
|||||||
|
|
||||||
task.set_state(State::Polled(Some(msg)));
|
task.set_state(State::Polled(Some(msg)));
|
||||||
|
|
||||||
let mut parser = TestParser::default();
|
let mut parser = TestParser {
|
||||||
parser.urls = vec![url.clone()]; // at index `msg`
|
urls: vec![url.clone()], // at index `msg`
|
||||||
|
};
|
||||||
|
|
||||||
task.trigger(Event::Parse(&mut parser)).await.unwrap();
|
task.trigger(Event::Parse(&mut parser)).await.unwrap();
|
||||||
|
|
||||||
@ -155,7 +158,6 @@ async fn test_polled_none_parse() {
|
|||||||
task.set_state(State::Polled(None));
|
task.set_state(State::Polled(None));
|
||||||
|
|
||||||
let mut parser = TestParser::default();
|
let mut parser = TestParser::default();
|
||||||
parser.urls = vec![];
|
|
||||||
|
|
||||||
task.trigger(Event::Parse(&mut parser)).await.unwrap();
|
task.trigger(Event::Parse(&mut parser)).await.unwrap();
|
||||||
|
|
||||||
|
@ -124,7 +124,7 @@ async fn try_delete_blob(input_url: Url) -> Result<()> {
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(err) => Err(err.into()),
|
Err(err) => Err(err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +176,6 @@ async fn try_delete_blob(input_url: Url) -> Result<()> {
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(err) => Err(err.into()),
|
Err(err) => Err(err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -153,7 +153,7 @@ impl CrashReport {
|
|||||||
call_stack: asan_log.call_stack().to_vec(),
|
call_stack: asan_log.call_stack().to_vec(),
|
||||||
call_stack_sha256: asan_log.call_stack_sha256(),
|
call_stack_sha256: asan_log.call_stack_sha256(),
|
||||||
asan_log: Some(asan_log.text().to_string()),
|
asan_log: Some(asan_log.text().to_string()),
|
||||||
scariness_score: asan_log.scariness_score().into(),
|
scariness_score: asan_log.scariness_score(),
|
||||||
scariness_description: asan_log.scariness_description().to_owned(),
|
scariness_description: asan_log.scariness_description().to_owned(),
|
||||||
task_id,
|
task_id,
|
||||||
job_id,
|
job_id,
|
||||||
|
@ -53,8 +53,8 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let sha = run_cmd(&["git", "rev-parse", "HEAD"])?;
|
let sha = run_cmd(&["git", "rev-parse", "HEAD"])?;
|
||||||
|
|
||||||
let hardcode_version = env::var("ONEFUZZ_SET_VERSION");
|
let hardcode_version = env::var("ONEFUZZ_SET_VERSION");
|
||||||
if hardcode_version.is_ok() {
|
if let Ok(hardcode_version) = &hardcode_version {
|
||||||
print_values(hardcode_version.unwrap().as_ref(), &sha);
|
print_values(hardcode_version, &sha);
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ impl StaticConfig {
|
|||||||
pub fn from_env() -> Result<Self> {
|
pub fn from_env() -> Result<Self> {
|
||||||
let instance_id = Uuid::parse_str(&std::env::var("ONEFUZZ_INSTANCE_ID")?)?;
|
let instance_id = Uuid::parse_str(&std::env::var("ONEFUZZ_INSTANCE_ID")?)?;
|
||||||
let client_id = Uuid::parse_str(&std::env::var("ONEFUZZ_CLIENT_ID")?)?;
|
let client_id = Uuid::parse_str(&std::env::var("ONEFUZZ_CLIENT_ID")?)?;
|
||||||
let client_secret = std::env::var("ONEFUZZ_CLIENT_SECRET")?.into();
|
let client_secret = std::env::var("ONEFUZZ_CLIENT_SECRET")?;
|
||||||
let tenant = std::env::var("ONEFUZZ_TENANT")?;
|
let tenant = std::env::var("ONEFUZZ_TENANT")?;
|
||||||
let onefuzz_url = Url::parse(&std::env::var("ONEFUZZ_URL")?)?;
|
let onefuzz_url = Url::parse(&std::env::var("ONEFUZZ_URL")?)?;
|
||||||
let pool_name = std::env::var("ONEFUZZ_POOL")?;
|
let pool_name = std::env::var("ONEFUZZ_POOL")?;
|
||||||
@ -111,13 +111,9 @@ impl StaticConfig {
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let credentials = ClientCredentials::new(
|
let credentials =
|
||||||
client_id,
|
ClientCredentials::new(client_id, client_secret, onefuzz_url.to_string(), tenant)
|
||||||
client_secret,
|
.into();
|
||||||
onefuzz_url.clone().to_string(),
|
|
||||||
tenant,
|
|
||||||
)
|
|
||||||
.into();
|
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
instance_id,
|
instance_id,
|
||||||
@ -240,7 +236,7 @@ impl Registration {
|
|||||||
);
|
);
|
||||||
delay_with_jitter(REGISTRATION_RETRY_PERIOD).await;
|
delay_with_jitter(REGISTRATION_RETRY_PERIOD).await;
|
||||||
}
|
}
|
||||||
Err(err) => return Err(err.into()),
|
Err(err) => return Err(err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +254,7 @@ impl Coordinator {
|
|||||||
Ok(response)
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_request<'a>(&self, request_type: RequestType<'a>) -> Result<Request> {
|
fn build_request(&self, request_type: RequestType<'_>) -> Result<Request> {
|
||||||
match request_type {
|
match request_type {
|
||||||
RequestType::PollCommands => self.poll_commands_request(),
|
RequestType::PollCommands => self.poll_commands_request(),
|
||||||
RequestType::ClaimCommand(message_id) => self.claim_command_request(message_id),
|
RequestType::ClaimCommand(message_id) => self.claim_command_request(message_id),
|
||||||
|
@ -62,20 +62,19 @@ fn main() -> Result<()> {
|
|||||||
Opt::Run(opt) => run(opt)?,
|
Opt::Run(opt) => run(opt)?,
|
||||||
Opt::Debug(opt) => debug::debug(opt)?,
|
Opt::Debug(opt) => debug::debug(opt)?,
|
||||||
Opt::Licenses => licenses()?,
|
Opt::Licenses => licenses()?,
|
||||||
Opt::Version => version()?,
|
Opt::Version => version(),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn version() -> Result<()> {
|
fn version() {
|
||||||
println!(
|
println!(
|
||||||
"{} onefuzz:{} git:{}",
|
"{} onefuzz:{} git:{}",
|
||||||
crate_version!(),
|
crate_version!(),
|
||||||
env!("ONEFUZZ_VERSION"),
|
env!("ONEFUZZ_VERSION"),
|
||||||
env!("GIT_VERSION")
|
env!("GIT_VERSION")
|
||||||
);
|
);
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn licenses() -> Result<()> {
|
fn licenses() -> Result<()> {
|
||||||
|
@ -38,11 +38,7 @@ impl Worker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_done(&self) -> bool {
|
pub fn is_done(&self) -> bool {
|
||||||
if let Worker::Done(..) = self {
|
matches!(self, Worker::Done(..))
|
||||||
true
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn update(
|
pub async fn update(
|
||||||
|
@ -22,11 +22,12 @@ impl Fixture {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn child_running(&self) -> ChildDouble {
|
fn child_running(&self) -> ChildDouble {
|
||||||
let mut child = ChildDouble::default();
|
ChildDouble {
|
||||||
child.id = 123; // Not default
|
id: 123,
|
||||||
child.stderr = "stderr".into();
|
stderr: "stderr".into(),
|
||||||
child.stdout = "stdout".into();
|
stdout: "stdout".into(),
|
||||||
child
|
..Default::default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn child_exited(&self, exit_status: ExitStatus) -> ChildDouble {
|
fn child_exited(&self, exit_status: ExitStatus) -> ChildDouble {
|
||||||
|
@ -190,7 +190,8 @@ pub async fn check_asan_string(mut data: String) -> Result<Option<AsanLog>> {
|
|||||||
|
|
||||||
pub async fn check_asan_path(asan_dir: &Path) -> Result<Option<AsanLog>> {
|
pub async fn check_asan_path(asan_dir: &Path) -> Result<Option<AsanLog>> {
|
||||||
let mut entries = fs::read_dir(asan_dir).await?;
|
let mut entries = fs::read_dir(asan_dir).await?;
|
||||||
while let Some(file) = entries.next().await {
|
// there should be only up to one file in asan_dir
|
||||||
|
if let Some(file) = entries.next().await {
|
||||||
let file = file?;
|
let file = file?;
|
||||||
let mut asan_text = fs::read_to_string(file.path()).await?;
|
let mut asan_text = fs::read_to_string(file.path()).await?;
|
||||||
let asan = AsanLog::parse(asan_text.clone());
|
let asan = AsanLog::parse(asan_text.clone());
|
||||||
|
@ -163,7 +163,7 @@ mod tests {
|
|||||||
let mut len = 0;
|
let mut len = 0;
|
||||||
let mut entries = fs::read_dir(dir).await.unwrap();
|
let mut entries = fs::read_dir(dir).await.unwrap();
|
||||||
|
|
||||||
while let Some(_) = entries.next().await {
|
while entries.next().await.is_some() {
|
||||||
len += 1;
|
len += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,10 +104,11 @@ impl<'a> LibFuzzer<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if a max_time is already set
|
// check if a max_time is already set
|
||||||
if let None = self
|
if self
|
||||||
.options
|
.options
|
||||||
.iter()
|
.iter()
|
||||||
.find(|o| o.starts_with("-max_total_time"))
|
.find(|o| o.starts_with("-max_total_time"))
|
||||||
|
.is_none()
|
||||||
{
|
{
|
||||||
cmd.arg(format!("-max_total_time={}", DEFAULT_MAX_TOTAL_SECONDS));
|
cmd.arg(format!("-max_total_time={}", DEFAULT_MAX_TOTAL_SECONDS));
|
||||||
}
|
}
|
||||||
@ -252,13 +253,13 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_libfuzzer_line_pulse() {
|
fn test_libfuzzer_line_pulse() {
|
||||||
let line = r"#2097152 pulse cov: 11 ft: 11 corp: 6/21b lim: 4096 exec/s: 699050 rss: 562Mb".into();
|
let line = r"#2097152 pulse cov: 11 ft: 11 corp: 6/21b lim: 4096 exec/s: 699050 rss: 562Mb";
|
||||||
|
|
||||||
let parsed = LibFuzzerLine::parse(line)
|
let parsed = LibFuzzerLine::parse(line)
|
||||||
.expect("parse error")
|
.expect("parse error")
|
||||||
.expect("no captures");
|
.expect("no captures");
|
||||||
|
|
||||||
assert_eq!(parsed.iters(), 2097152);
|
assert_eq!(parsed.iters(), 2097152);
|
||||||
assert_eq!(parsed.execs_sec(), 699050.0);
|
assert_eq!(parsed.execs_sec(), 699050.0_f64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,8 +188,8 @@ mod global {
|
|||||||
assert_eq!(last_state, UNSET, "unexpected telemetry client state");
|
assert_eq!(last_state, UNSET, "unexpected telemetry client state");
|
||||||
|
|
||||||
unsafe {
|
unsafe {
|
||||||
CLIENTS.instance = instance.map(|s| RwLock::new(s));
|
CLIENTS.instance = instance.map(RwLock::new);
|
||||||
CLIENTS.shared = shared.map(|s| RwLock::new(s));
|
CLIENTS.shared = shared.map(RwLock::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATE.store(SET, SeqCst);
|
STATE.store(SET, SeqCst);
|
||||||
|
@ -167,7 +167,7 @@ impl Crash {
|
|||||||
|
|
||||||
let proc = stacktrace.trace(tid.as_raw() as u32)?;
|
let proc = stacktrace.trace(tid.as_raw() as u32)?;
|
||||||
|
|
||||||
let crashing_access = segv_access_addr(siginfo)?.map(|a| a.into());
|
let crashing_access = segv_access_addr(siginfo).map(|a| a.into());
|
||||||
|
|
||||||
let maps = proc_maps::get_process_maps(tid.as_raw())?;
|
let maps = proc_maps::get_process_maps(tid.as_raw())?;
|
||||||
|
|
||||||
@ -331,10 +331,10 @@ fn find_mapping(addr: u64, maps: &[MapRange]) -> Option<&MapRange> {
|
|||||||
// Only 4 signals populate the `si_addr` field of `siginfo_t`. See `sigaction(2)`.
|
// Only 4 signals populate the `si_addr` field of `siginfo_t`. See `sigaction(2)`.
|
||||||
// On Linux, the most reliable one is SIGSEGV, which saves the address of the invalid
|
// On Linux, the most reliable one is SIGSEGV, which saves the address of the invalid
|
||||||
// memory access.
|
// memory access.
|
||||||
fn segv_access_addr(siginfo: Siginfo) -> Result<Option<u64>> {
|
fn segv_access_addr(siginfo: Siginfo) -> Option<u64> {
|
||||||
let is_segv = siginfo.si_signo == (SIGSEGV as i32);
|
let is_segv = siginfo.si_signo == (SIGSEGV as i32);
|
||||||
|
|
||||||
let addr = if is_segv {
|
if is_segv {
|
||||||
// Accessing a union, safe because we checked `si_signo`.
|
// Accessing a union, safe because we checked `si_signo`.
|
||||||
let ptr = unsafe { siginfo.si_addr() };
|
let ptr = unsafe { siginfo.si_addr() };
|
||||||
|
|
||||||
@ -343,9 +343,7 @@ fn segv_access_addr(siginfo: Siginfo) -> Result<Option<u64>> {
|
|||||||
Some(addr)
|
Some(addr)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
}
|
||||||
|
|
||||||
Ok(addr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const CRASH_SIGNALS: &[Signal] = &[SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGABRT];
|
const CRASH_SIGNALS: &[Signal] = &[SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP, SIGABRT];
|
||||||
|
@ -10,4 +10,7 @@ anyhow = "1.0"
|
|||||||
async-trait = "0.1.36"
|
async-trait = "0.1.36"
|
||||||
reqwest = { version = "0.10", features = ["json", "stream"] }
|
reqwest = { version = "0.10", features = ["json", "stream"] }
|
||||||
backoff = { version = "0.2.1", features = ["async-std"] }
|
backoff = { version = "0.2.1", features = ["async-std"] }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tokio = { version = "0.2" }
|
Reference in New Issue
Block a user