From 033f94ac7411a673bf18850b2a33a406e547bd17 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Sun, 8 Dec 2024 00:25:39 +0530 Subject: [PATCH 1/9] add support to share new objectives in CentralizedEventManager --- libafl/Cargo.toml | 3 +++ libafl/src/events/centralized.rs | 24 ++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/libafl/Cargo.toml b/libafl/Cargo.toml index 2592a2c7c1..7a21b39727 100644 --- a/libafl/Cargo.toml +++ b/libafl/Cargo.toml @@ -142,6 +142,9 @@ unicode = ["libafl_bolts/alloc", "ahash/std", "serde/rc", "bitvec"] ## Enable multi-part input formats and mutators multipart_inputs = ["arrayvec", "rand_trait"] +## Share objectives across nodes +share_objectives = [] + #! ## LibAFL-Bolts Features ## Provide the `#[derive(SerdeAny)]` macro. diff --git a/libafl/src/events/centralized.rs b/libafl/src/events/centralized.rs index 515c8ec5b9..10f7afcec3 100644 --- a/libafl/src/events/centralized.rs +++ b/libafl/src/events/centralized.rs @@ -287,22 +287,29 @@ where ) -> Result<(), Error> { if !self.is_main { // secondary node - let mut is_tc = false; - // Forward to main only if new tc or heartbeat + let mut is_tc_or_obj = false; + // Forward to main only if new tc, heartbeat, or optionally, a new objective let should_be_forwarded = match &mut event { Event::NewTestcase { forward_id, .. } => { *forward_id = Some(ClientId(self.inner.mgr_id().0 as u32)); - is_tc = true; + is_tc_or_obj = true; true } Event::UpdateExecStats { .. } => true, // send it but this guy won't be handled. the only purpose is to keep this client alive else the broker thinks it is dead and will dc it + + #[cfg(feature = "share_objectives")] + Event::Objective { .. } => { + is_tc_or_obj = true; + true + } + Event::Stop => true, _ => false, }; if should_be_forwarded { self.forward_to_main(&event)?; - if is_tc { + if is_tc_or_obj { // early return here because we only send it to centralized not main broker. return Ok(()); } @@ -675,6 +682,15 @@ where log::debug!("[{}] {} was discarded...)", process::id(), event_name); } } + + #[cfg(feature = "share_objectives")] + Event::Objective { .. } => { + log::debug!("Received new objective"); + + self.hooks.on_fire_all(state, client_id, &event)?; + self.inner.fire(state, event)?; + } + Event::Stop => { state.request_stop(); } From 96ee38208bf8da4031cc232bd572a984abdbe285 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Sun, 8 Dec 2024 03:05:10 +0530 Subject: [PATCH 2/9] handle received Objectives --- libafl/src/events/centralized.rs | 2 +- libafl/src/events/llmp/mgr.rs | 6 ++++++ libafl/src/events/llmp/mod.rs | 7 +++++++ libafl/src/events/tcp.rs | 6 ++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libafl/src/events/centralized.rs b/libafl/src/events/centralized.rs index 10f7afcec3..c24d6f6a95 100644 --- a/libafl/src/events/centralized.rs +++ b/libafl/src/events/centralized.rs @@ -685,7 +685,7 @@ where #[cfg(feature = "share_objectives")] Event::Objective { .. } => { - log::debug!("Received new objective"); + log::debug!("Received new Objective"); self.hooks.on_fire_all(state, client_id, &event)?; self.inner.fire(state, event)?; diff --git a/libafl/src/events/llmp/mgr.rs b/libafl/src/events/llmp/mgr.rs index 1153c30610..0c80007329 100644 --- a/libafl/src/events/llmp/mgr.rs +++ b/libafl/src/events/llmp/mgr.rs @@ -461,6 +461,12 @@ where } } } + + #[cfg(feature = "share_objectives")] + Event::Objective { .. } => { + log::debug!("Received new Objective"); + } + Event::CustomBuf { tag, buf } => { for handler in &mut self.custom_buf_handlers { if handler(state, &tag, &buf)? == CustomBufEventResult::Handled { diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index bdbe32f4ba..ac8026689f 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -321,6 +321,13 @@ where } Ok(()) } + + #[cfg(feature = "share_objectives")] + Event::Objective { .. } => { + log::info!("Received new Objective"); + Ok(()) + } + Event::CustomBuf { tag, buf } => { for handler in &mut self.custom_buf_handlers { if handler(state, &tag, &buf)? == CustomBufEventResult::Handled { diff --git a/libafl/src/events/tcp.rs b/libafl/src/events/tcp.rs index 977ad9de85..98e0c63dd5 100644 --- a/libafl/src/events/tcp.rs +++ b/libafl/src/events/tcp.rs @@ -644,6 +644,12 @@ where log::info!("Added received Testcase as item #{item}"); } } + + #[cfg(feature = "share_objectives")] + Event::Objective { .. } => { + log::info!("Received new Objective"); + } + Event::CustomBuf { tag, buf } => { for handler in &mut self.custom_buf_handlers { if handler(state, &tag, &buf)? == CustomBufEventResult::Handled { From a88aea57de941e4ed737cf4545ce272a2cb62453 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Tue, 10 Dec 2024 18:50:09 +0530 Subject: [PATCH 3/9] remove duplicate event fires in centralized event manager --- libafl/src/events/centralized.rs | 14 ++++---------- libafl/src/events/llmp/mod.rs | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/libafl/src/events/centralized.rs b/libafl/src/events/centralized.rs index c24d6f6a95..310ab0ba27 100644 --- a/libafl/src/events/centralized.rs +++ b/libafl/src/events/centralized.rs @@ -287,21 +287,18 @@ where ) -> Result<(), Error> { if !self.is_main { // secondary node - let mut is_tc_or_obj = false; + let mut is_tc = false; // Forward to main only if new tc, heartbeat, or optionally, a new objective let should_be_forwarded = match &mut event { Event::NewTestcase { forward_id, .. } => { *forward_id = Some(ClientId(self.inner.mgr_id().0 as u32)); - is_tc_or_obj = true; + is_tc = true; true } Event::UpdateExecStats { .. } => true, // send it but this guy won't be handled. the only purpose is to keep this client alive else the broker thinks it is dead and will dc it #[cfg(feature = "share_objectives")] - Event::Objective { .. } => { - is_tc_or_obj = true; - true - } + Event::Objective { .. } => true, Event::Stop => true, _ => false, @@ -309,7 +306,7 @@ where if should_be_forwarded { self.forward_to_main(&event)?; - if is_tc_or_obj { + if is_tc { // early return here because we only send it to centralized not main broker. return Ok(()); } @@ -686,9 +683,6 @@ where #[cfg(feature = "share_objectives")] Event::Objective { .. } => { log::debug!("Received new Objective"); - - self.hooks.on_fire_all(state, client_id, &event)?; - self.inner.fire(state, event)?; } Event::Stop => { diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index ac8026689f..7331ac49fb 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -324,7 +324,7 @@ where #[cfg(feature = "share_objectives")] Event::Objective { .. } => { - log::info!("Received new Objective"); + log::debug!("Received new Objective"); Ok(()) } From d369d3dfa84a14c6590a43f50c3625aa040da333 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Thu, 12 Dec 2024 00:18:10 +0530 Subject: [PATCH 4/9] share input on share_objectives feature (broken) --- libafl/src/events/llmp/mod.rs | 15 +++++++++++++-- libafl/src/events/mod.rs | 3 +++ libafl/src/executors/inprocess/mod.rs | 3 +++ libafl/src/fuzzer/mod.rs | 6 ++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index 7331ac49fb..5fef003d7f 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -15,6 +15,11 @@ use libafl_bolts::{ }; use serde::Deserialize; +#[cfg(feature = "share_objectives")] +use crate::{ + corpus::{Corpus, Testcase}, + state::{HasCorpus, HasSolutions}, +}; use crate::{ events::{CustomBufEventResult, CustomBufHandlerFn, Event, EventFirer}, executors::{Executor, HasObservers}, @@ -253,7 +258,7 @@ where impl LlmpEventConverter where - S: UsesInput + HasExecutions + HasMetadata + Stoppable, + S: UsesInput + HasExecutions + HasMetadata + Stoppable + HasCorpus + HasSolutions, SP: ShMemProvider, IC: InputConverter, ICB: InputConverter, @@ -323,8 +328,14 @@ where } #[cfg(feature = "share_objectives")] - Event::Objective { .. } => { + Event::Objective { input, .. } => { log::debug!("Received new Objective"); + + let testcase = Testcase::from(input.clone()); + testcase.set_parent_id_optional(*state.corpus().current()); + state.solutions_mut().add(testcase)?; + log::info!("Added received Objective to Corpus"); + Ok(()) } diff --git a/libafl/src/events/mod.rs b/libafl/src/events/mod.rs index 81ab7f7d32..dd48c1c203 100644 --- a/libafl/src/events/mod.rs +++ b/libafl/src/events/mod.rs @@ -325,6 +325,9 @@ where }, /// A new objective was found Objective { + /// Input of newly found Objective + #[cfg(feature = "share_objectives")] + input: I, /// Objective corpus size objective_size: usize, /// The time when this event was created diff --git a/libafl/src/executors/inprocess/mod.rs b/libafl/src/executors/inprocess/mod.rs index e326743cce..2086208e36 100644 --- a/libafl/src/executors/inprocess/mod.rs +++ b/libafl/src/executors/inprocess/mod.rs @@ -477,6 +477,9 @@ pub fn run_observers_and_save_state( .fire( state, Event::Objective { + #[cfg(feature = "share_objectives")] + input: input.clone(), + objective_size: state.solutions().count(), time: libafl_bolts::current_time(), }, diff --git a/libafl/src/fuzzer/mod.rs b/libafl/src/fuzzer/mod.rs index bd82146662..9e6587c3e8 100644 --- a/libafl/src/fuzzer/mod.rs +++ b/libafl/src/fuzzer/mod.rs @@ -508,6 +508,9 @@ where manager.fire( state, Event::Objective { + #[cfg(feature = "share_objectives")] + input: input, + objective_size: state.solutions().count(), time: current_time(), }, @@ -686,6 +689,9 @@ where manager.fire( state, Event::Objective { + #[cfg(feature = "share_objectives")] + input: input, + objective_size: state.solutions().count(), time: current_time(), }, From 971d4ee38b93aca16d34e52eb850eab14b99ef96 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Thu, 12 Dec 2024 23:35:23 +0530 Subject: [PATCH 5/9] split impl LlmpEventManager based on share_objectives --- libafl/src/events/llmp/mod.rs | 145 +++++++++++++++++++++++++++++++++- 1 file changed, 141 insertions(+), 4 deletions(-) diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index 5fef003d7f..735eb97336 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -256,9 +256,10 @@ where } } +#[cfg(not(feature = "share_objectives"))] impl LlmpEventConverter where - S: UsesInput + HasExecutions + HasMetadata + Stoppable + HasCorpus + HasSolutions, + S: UsesInput + HasExecutions + HasMetadata + Stoppable, SP: ShMemProvider, IC: InputConverter, ICB: InputConverter, @@ -326,19 +327,155 @@ where } Ok(()) } + Event::CustomBuf { tag, buf } => { + for handler in &mut self.custom_buf_handlers { + if handler(state, &tag, &buf)? == CustomBufEventResult::Handled { + break; + } + } + Ok(()) + } + Event::Stop => Ok(()), + _ => Err(Error::unknown(format!( + "Received illegal message that message should not have arrived: {:?}.", + event.name() + ))), + } + } + + /// Handle arriving events in the client + #[allow(clippy::unused_self)] + pub fn process( + &mut self, + fuzzer: &mut Z, + state: &mut S, + executor: &mut E, + manager: &mut EM, + ) -> Result + where + E: Executor + HasObservers, + EM: UsesState + EventFirer, + for<'a> E::Observers: Deserialize<'a>, + Z: ExecutionProcessor + EvaluatorObservers, + { + // TODO: Get around local event copy by moving handle_in_client + let self_id = self.llmp.sender().id(); + let mut count = 0; + while let Some((client_id, tag, _flags, msg)) = self.llmp.recv_buf_with_flags()? { + assert!( + tag != _LLMP_TAG_EVENT_TO_BROKER, + "EVENT_TO_BROKER parcel should not have arrived in the client!" + ); + + if client_id == self_id { + continue; + } + #[cfg(not(feature = "llmp_compression"))] + let event_bytes = msg; + #[cfg(feature = "llmp_compression")] + let compressed; + #[cfg(feature = "llmp_compression")] + let event_bytes = if _flags & LLMP_FLAG_COMPRESSED == LLMP_FLAG_COMPRESSED { + compressed = self.compressor.decompress(msg)?; + &compressed + } else { + msg + }; + + let event: Event = postcard::from_bytes(event_bytes)?; + log::debug!("Processor received message {}", event.name_detailed()); + self.handle_in_client(fuzzer, executor, state, manager, client_id, event)?; + count += 1; + } + Ok(count) + } +} + +#[cfg(feature = "share_objectives")] +impl LlmpEventConverter +where + S: UsesInput + HasExecutions + HasMetadata + Stoppable + HasCorpus + HasSolutions, + SP: ShMemProvider, + IC: InputConverter, + ICB: InputConverter, + DI: Input, +{ + // TODO other new_* routines + + /// Check if it can convert the input + pub fn can_convert(&self) -> bool { + self.converter.is_some() + } + + /// Check if it can convert the input back + pub fn can_convert_back(&self) -> bool { + self.converter_back.is_some() + } + + /// Describe the client event mgr's llmp parts in a restorable fashion + pub fn describe(&self) -> Result { + self.llmp.describe() + } + + /// Write the config for a client `EventManager` to env vars, a new client can reattach using [`LlmpEventConverterBuilder::build_existing_client_from_env()`]. + #[cfg(feature = "std")] + pub fn to_env(&self, env_name: &str) { + self.llmp.to_env(env_name).unwrap(); + } + + // Handle arriving events in the client + fn handle_in_client( + &mut self, + fuzzer: &mut Z, + executor: &mut E, + state: &mut S, + manager: &mut EM, + client_id: ClientId, + event: Event, + ) -> Result<(), Error> + where + E: Executor + HasObservers, + EM: UsesState + EventFirer, + for<'a> E::Observers: Deserialize<'a>, + Z: ExecutionProcessor + EvaluatorObservers, + { + match event { + Event::NewTestcase { + input, forward_id, .. + } => { + log::debug!("Received new Testcase to convert from {client_id:?} (forward {forward_id:?}, forward {forward_id:?})"); - #[cfg(feature = "share_objectives")] + let Some(converter) = self.converter_back.as_mut() else { + return Ok(()); + }; + + let res = fuzzer.evaluate_input_with_observers::( + state, + executor, + manager, + converter.convert(input)?, + false, + )?; + + if let Some(item) = res.1 { + log::info!("Added received Testcase as item #{item}"); + } + Ok(()) + } Event::Objective { input, .. } => { log::debug!("Received new Objective"); - let testcase = Testcase::from(input.clone()); + let Some(converter) = self.converter_back.as_mut() else { + return Ok(()); + }; + + let testcase = Testcase::from(converter.convert(input)?); testcase.set_parent_id_optional(*state.corpus().current()); state.solutions_mut().add(testcase)?; log::info!("Added received Objective to Corpus"); Ok(()) } - Event::CustomBuf { tag, buf } => { for handler in &mut self.custom_buf_handlers { if handler(state, &tag, &buf)? == CustomBufEventResult::Handled { From 91e49a6b58576367f5e5db9f63f981029cec42a6 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Fri, 13 Dec 2024 00:09:17 +0530 Subject: [PATCH 6/9] reduce code duplication in impl LlmpEventManager (broken) --- libafl/src/events/llmp/mod.rs | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index 735eb97336..e8a284973c 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -256,7 +256,6 @@ where } } -#[cfg(not(feature = "share_objectives"))] impl LlmpEventConverter where S: UsesInput + HasExecutions + HasMetadata + Stoppable, @@ -289,6 +288,7 @@ where } // Handle arriving events in the client + #[cfg(not(feature = "share_objectives"))] fn handle_in_client( &mut self, fuzzer: &mut Z, @@ -344,6 +344,7 @@ where } /// Handle arriving events in the client + #[cfg(not(feature = "share_objectives"))] #[allow(clippy::unused_self)] pub fn process( &mut self, @@ -400,29 +401,6 @@ where ICB: InputConverter, DI: Input, { - // TODO other new_* routines - - /// Check if it can convert the input - pub fn can_convert(&self) -> bool { - self.converter.is_some() - } - - /// Check if it can convert the input back - pub fn can_convert_back(&self) -> bool { - self.converter_back.is_some() - } - - /// Describe the client event mgr's llmp parts in a restorable fashion - pub fn describe(&self) -> Result { - self.llmp.describe() - } - - /// Write the config for a client `EventManager` to env vars, a new client can reattach using [`LlmpEventConverterBuilder::build_existing_client_from_env()`]. - #[cfg(feature = "std")] - pub fn to_env(&self, env_name: &str) { - self.llmp.to_env(env_name).unwrap(); - } - // Handle arriving events in the client fn handle_in_client( &mut self, From e17d84e63350bc978b1612e553d9b0506cbc5a56 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Sat, 14 Dec 2024 03:38:04 +0530 Subject: [PATCH 7/9] fix traits error (temp) --- libafl/src/stages/sync.rs | 92 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/libafl/src/stages/sync.rs b/libafl/src/stages/sync.rs index 3dbed175a2..a0ce464025 100644 --- a/libafl/src/stages/sync.rs +++ b/libafl/src/stages/sync.rs @@ -12,6 +12,8 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "introspection")] use crate::state::HasClientPerfMonitor; +#[cfg(feature = "share_objectives")] +use crate::state::HasSolutions; use crate::{ corpus::{Corpus, CorpusId}, events::{llmp::LlmpEventConverter, Event, EventConfig, EventFirer}, @@ -245,6 +247,8 @@ where type State = S; } +// Do not include trait bound HasSolutions to S if share_objectives is disabled +#[cfg(not(feature = "share_objectives"))] impl Stage for SyncFromBrokerStage where EM: UsesState + EventFirer, @@ -331,6 +335,94 @@ where } } +// Add trait bound HasSolutions to S if share_objectives is enabled +#[cfg(feature = "share_objectives")] +impl Stage for SyncFromBrokerStage +where + EM: UsesState + EventFirer, + S: State + HasExecutions + HasCorpus + HasRand + HasMetadata + HasSolutions, + SP: ShMemProvider, + E: HasObservers + Executor, + for<'a> E::Observers: Deserialize<'a>, + Z: EvaluatorObservers + + ExecutionProcessor, + IC: InputConverter, + ICB: InputConverter, + DI: Input, + <::Corpus as Corpus>::Input: Clone, + S::Corpus: Corpus, // delete me +{ + #[inline] + fn perform( + &mut self, + fuzzer: &mut Z, + executor: &mut E, + state: &mut Self::State, + manager: &mut EM, + ) -> Result<(), Error> { + if self.client.can_convert() { + let last_id = state + .metadata_map() + .get::() + .and_then(|m| m.last_id); + + let mut cur_id = + last_id.map_or_else(|| state.corpus().first(), |id| state.corpus().next(id)); + + while let Some(id) = cur_id { + let input = state.corpus().cloned_input_for_id(id)?; + + self.client.fire( + state, + Event::NewTestcase { + input, + observers_buf: None, + exit_kind: ExitKind::Ok, + corpus_size: 0, // TODO choose if sending 0 or the actual real value + client_config: EventConfig::AlwaysUnique, + time: current_time(), + forward_id: None, + #[cfg(all(unix, feature = "std", feature = "multi_machine"))] + node_id: None, + }, + )?; + + cur_id = state.corpus().next(id); + } + + let last = state.corpus().last(); + if last_id.is_none() { + state + .metadata_map_mut() + .insert(SyncFromBrokerMetadata::new(last)); + } else { + state + .metadata_map_mut() + .get_mut::() + .unwrap() + .last_id = last; + } + } + + self.client.process(fuzzer, state, executor, manager)?; + #[cfg(feature = "introspection")] + state.introspection_monitor_mut().finish_stage(); + Ok(()) + } + + #[inline] + fn should_restart(&mut self, _state: &mut Self::State) -> Result { + // No restart handling needed - does not execute the target. + Ok(true) + } + + #[inline] + fn clear_progress(&mut self, _state: &mut Self::State) -> Result<(), Error> { + // Not needed - does not execute the target. + Ok(()) + } +} + impl SyncFromBrokerStage where SP: ShMemProvider + 'static, From 4de182afc9b7c8fd415df4d978e3f85fe6f391e0 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Sun, 15 Dec 2024 23:46:44 +0530 Subject: [PATCH 8/9] fix mismatched types --- libafl/src/events/llmp/mod.rs | 19 ++++++++++++++++--- libafl/src/stages/sync.rs | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libafl/src/events/llmp/mod.rs b/libafl/src/events/llmp/mod.rs index e8a284973c..586dea66c8 100644 --- a/libafl/src/events/llmp/mod.rs +++ b/libafl/src/events/llmp/mod.rs @@ -18,7 +18,7 @@ use serde::Deserialize; #[cfg(feature = "share_objectives")] use crate::{ corpus::{Corpus, Testcase}, - state::{HasCorpus, HasSolutions}, + state::{HasCurrentTestcase, HasSolutions}, }; use crate::{ events::{CustomBufEventResult, CustomBufHandlerFn, Event, EventFirer}, @@ -395,7 +395,14 @@ where #[cfg(feature = "share_objectives")] impl LlmpEventConverter where - S: UsesInput + HasExecutions + HasMetadata + Stoppable + HasCorpus + HasSolutions, + S: UsesInput + + HasExecutions + + HasSolutions + + HasMetadata + + Stoppable + + State + + HasCurrentTestcase, + S::Solutions: Corpus, SP: ShMemProvider, IC: InputConverter, ICB: InputConverter, @@ -447,8 +454,14 @@ where return Ok(()); }; - let testcase = Testcase::from(converter.convert(input)?); + let converted_input = converter.convert(input)?; + let mut testcase = Testcase::from(converted_input); testcase.set_parent_id_optional(*state.corpus().current()); + + if let Ok(mut tc) = state.current_testcase_mut() { + tc.found_objective(); + } + state.solutions_mut().add(testcase)?; log::info!("Added received Objective to Corpus"); diff --git a/libafl/src/stages/sync.rs b/libafl/src/stages/sync.rs index a0ce464025..8cc521dd62 100644 --- a/libafl/src/stages/sync.rs +++ b/libafl/src/stages/sync.rs @@ -351,6 +351,7 @@ where DI: Input, <::Corpus as Corpus>::Input: Clone, S::Corpus: Corpus, // delete me + S::Solutions: Corpus, { #[inline] fn perform( From 10ba9e45cae9259e0d018912fc769235071c0254 Mon Sep 17 00:00:00 2001 From: Dhanvith Nayak Date: Tue, 17 Dec 2024 03:16:46 +0530 Subject: [PATCH 9/9] fix cargo format issue --- libafl/src/stages/sync.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/libafl/src/stages/sync.rs b/libafl/src/stages/sync.rs index ea140dca2b..0316b3b400 100644 --- a/libafl/src/stages/sync.rs +++ b/libafl/src/stages/sync.rs @@ -12,7 +12,6 @@ use serde::{Deserialize, Serialize}; #[cfg(feature = "share_objectives")] use crate::state::HasSolutions; - use crate::{ corpus::{Corpus, CorpusId, HasCurrentCorpusId}, events::{llmp::LlmpEventConverter, Event, EventConfig, EventFirer},