use std::borrow::Cow; use libafl::{ corpus::Testcase, events::EventFirer, executors::ExitKind, feedbacks::{Feedback, MapIndexesMetadata}, observers::ObserversTuple, schedulers::{MinimizerScheduler, TestcaseScore}, state::{HasCorpus, State}, Error, HasMetadata, }; use libafl_bolts::{Named, SerdeAny}; use serde::{Deserialize, Serialize}; use crate::input::PacketData; #[derive(Debug, SerdeAny, Serialize, Deserialize)] pub struct PacketLenMetadata { pub length: u64, } pub struct PacketLenTestcaseScore {} impl TestcaseScore for PacketLenTestcaseScore where S: HasCorpus + HasMetadata, { fn compute(_state: &S, entry: &mut Testcase) -> Result { Ok(entry .metadata_map() .get::() .map_or(1, |m| m.length) as f64) } } pub type PacketLenMinimizerScheduler = MinimizerScheduler; #[derive(Serialize, Deserialize, Default, Clone, Debug)] pub struct PacketLenFeedback { len: u64, } impl Feedback for PacketLenFeedback where S: State, { #[inline] fn is_interesting( &mut self, _state: &mut S, _manager: &mut EM, input: &PacketData, _observers: &OT, _exit_kind: &ExitKind, ) -> Result where EM: EventFirer, OT: ObserversTuple, { self.len = input.length; Ok(false) } #[inline] fn append_metadata( &mut self, _state: &mut S, _manager: &mut EM, _observers: &OT, testcase: &mut Testcase, ) -> Result<(), Error> { testcase .metadata_map_mut() .insert(PacketLenMetadata { length: self.len }); Ok(()) } } impl Named for PacketLenFeedback { #[inline] fn name(&self) -> &Cow<'static, str> { static NAME: Cow<'static, str> = Cow::Borrowed("PacketLenFeedback"); &NAME } } impl PacketLenFeedback { #[must_use] pub fn new() -> Self { Self::default() } }