diff --git a/afl/src/events/llmp.rs b/afl/src/events/llmp.rs index 298c9178c8..ac8679c3eb 100644 --- a/afl/src/events/llmp.rs +++ b/afl/src/events/llmp.rs @@ -246,24 +246,6 @@ impl LlmpConnection { } } - /// Returns the next message, tag, buf, if avaliable, else None - #[inline] - pub fn recv_buf(&mut self) -> Result, AflError> { - match self { - LlmpConnection::IsBroker { - broker, - listener_thread: _, - } => broker.recv_buf(), - LlmpConnection::IsClient { client } => client.recv_buf(), - } - } - - /// A client blocks/spins until the next message gets posted to the page, - /// then returns that message. - #[inline] - pub unsafe fn recv_blocking(&mut self) -> Result<*mut LlmpMsg, AflError> { - self.llmp_in.recv_blocking() - } } /// Contents of the share mem pages, used by llmp internally diff --git a/afl/src/events/mod.rs b/afl/src/events/mod.rs index cf12a52afb..8a428cfc30 100644 --- a/afl/src/events/mod.rs +++ b/afl/src/events/mod.rs @@ -22,7 +22,7 @@ use crate::executors::Executor; use crate::feedbacks::FeedbacksTuple; use crate::inputs::Input; use crate::observers::ObserversTuple; -use crate::serde_anymap::{Ptr, PtrMut, SerdeAny}; +use crate::serde_anymap::SerdeAny; use crate::utils::Rand; use crate::AflError; use crate::{engines::State, utils}; @@ -59,10 +59,9 @@ where /// Events sent around in the library #[derive(Serialize, Deserialize)] #[serde(bound = "I: serde::de::DeserializeOwned")] -pub enum Event<'a, I, OT> +pub enum Event where I: Input, - OT: ObserversTuple, { LoadInitial { sender_id: u64, @@ -70,9 +69,9 @@ where }, NewTestcase { sender_id: u64, - input: Ptr<'a, I>, - observers: PtrMut<'a, OT>, - corpus_count: usize, + input: I, + observers_buf: Vec, + client_config: String, }, UpdateStats { sender_id: u64, @@ -106,10 +105,9 @@ where }, } -impl<'a, I, OT> Event<'a, I, OT> +impl Event where I: Input, - OT: ObserversTuple, //CE: CustomEvent, { pub fn name(&self) -> &str { match self { @@ -120,8 +118,8 @@ where Event::NewTestcase { sender_id: _, input: _, - observers: _, - corpus_count: _, + client_config: _, + observers_buf: _, } => "New Testcase", Event::UpdateStats { sender_id: _, @@ -161,6 +159,19 @@ where } } + pub fn new_testcase(config: String, input: I, observers: Ot) -> Result + where + Ot: ObserversTuple, + { + let observers_buf = postcard::to_allocvec(&observers)?; + Ok(Self::NewTestcase { + sender_id: 0, + input: input, + client_config: config, + observers_buf: observers_buf, + }) + } + pub fn update_stats(executions: usize, execs_over_sec: u64) -> Self { Event::UpdateStats { sender_id: 0, @@ -181,7 +192,7 @@ where R: Rand, { /// Fire an Event - fn fire<'a>(&mut self, event: Event<'a, I, OT>) -> Result<(), AflError>; + fn fire<'a>(&mut self, event: Event) -> Result<(), AflError>; /// Lookup for incoming events and process them. /// Return the number of processes events or an error @@ -221,13 +232,13 @@ where } /// Broker fun - fn handle_in_broker(&mut self, event: &Event) -> Result { + fn handle_in_broker(&mut self, event: &Event) -> Result { match event { Event::NewTestcase { sender_id: _, input: _, - observers: _, - corpus_count, + observers_buf: _, + client_config: _, } => { self.corpus_size_inc(); println!( @@ -293,7 +304,7 @@ where /// Client fun fn handle_in_client( &mut self, - event: Event, + event: Event, state: &mut State, corpus: &mut C, ) -> Result<(), AflError> { @@ -301,14 +312,16 @@ where Event::NewTestcase { sender_id: _, input, - observers, - corpus_count: _, + observers_buf, + client_config: _, } => { - // here u should match sender_id, if equal to the current one do not re-execute + + // TODO: here u should match client_config, if equal to the current one do not re-execute // we need to pass engine to process() too, TODO #[cfg(feature = "std")] println!("Received new Testcase"); - let interestingness = state.is_interesting(input, observers)?; + let observers = postcard::from_bytes(&observers_buf)?; + let interestingness = state.is_interesting(&input, observers)?; state.add_if_interesting(corpus, input, interestingness); Ok(()) } @@ -357,7 +370,7 @@ where //CE: CustomEvent, { #[inline] - fn fire<'a>(&mut self, event: Event<'a, I, OT>) -> Result<(), AflError> { + fn fire<'a>(&mut self, event: Event) -> Result<(), AflError> { match self.handle_in_broker(&event)? { BrokerEventResult::Forward => (), //self.handle_in_client(event, state, corpus)?, // Ignore broker-only events @@ -420,7 +433,7 @@ where execs_over_sec: 0, corpus_size: 0, phantom: PhantomData, - }; + } } } @@ -466,7 +479,7 @@ where //CE: CustomEvent, { #[inline] - fn fire<'a>(&mut self, event: Event<'a, I, OT>) -> Result<(), AflError> { + fn fire<'a>(&mut self, event: Event) -> Result<(), AflError> { let serialized = postcard::to_allocvec(&event)?; self.send_buf(LLMP_TAG_EVENT_TO_CLIENT, &serialized)?; Ok(()) @@ -520,13 +533,14 @@ mod tests { fn test_event_serde() { let obv = StdMapObserver::new("test", unsafe { &mut MAP }); let mut map = tuple_list!(obv); + let observers_buf = postcard::to_allocvec(&map).unwrap(); let i = BytesInput::new(vec![0]); let e = Event::NewTestcase { sender_id: 0, - input: Ptr::Ref(&i), - observers: PtrMut::Ref(&mut map), - corpus_count: 1, + input: &i, + observers_buf: observers_buf, + client_config: "conf".into(), }; let j = serde_json::to_string(&e).unwrap(); @@ -537,10 +551,10 @@ mod tests { Event::NewTestcase { sender_id: _, input: _, - observers, - corpus_count: _, + observers_buf, + client_config: String, } => { - let o = observers + let o = postcard::from_bytes(&observers_buf).unwrap() .as_ref() .match_name_type::>("test") .unwrap(); diff --git a/afl/src/stages/mutational.rs b/afl/src/stages/mutational.rs index 54227a3449..2d438ce2fa 100644 --- a/afl/src/stages/mutational.rs +++ b/afl/src/stages/mutational.rs @@ -76,8 +76,8 @@ where // TODO decouple events manager and engine manager.fire(Event::NewTestcase { sender_id: 0, - input: Ptr::Ref(testcase.load_input()?), - observers: PtrMut::Ref(engine.executor_mut().observers_mut()), + input: testcase.load_input()?, + observers_buf: PtrMut::Ref(engine.executor_mut().observers_mut()), corpus_count: corpus.count() + 1, })?; // let _ = corpus.add(testcase);