From 4cafa8c2530ea10d402901f2bb0aa5d42bb50cde Mon Sep 17 00:00:00 2001 From: Dominik Maier Date: Wed, 30 Jun 2021 21:58:06 +0200 Subject: [PATCH] added mgr_id to eventmanager (#196) --- libafl/src/events/llmp.rs | 11 ++++++++++- libafl/src/events/mod.rs | 22 +++++++++++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/libafl/src/events/llmp.rs b/libafl/src/events/llmp.rs index 699999f966..2a82a969aa 100644 --- a/libafl/src/events/llmp.rs +++ b/libafl/src/events/llmp.rs @@ -25,7 +25,10 @@ use crate::{ llmp::{self, Flags, LlmpClientDescription, LlmpSender, Tag}, shmem::ShMemProvider, }, - events::{BrokerEventResult, Event, EventFirer, EventManager, EventProcessor, EventRestarter}, + events::{ + BrokerEventResult, Event, EventFirer, EventManager, EventManagerId, EventProcessor, + EventRestarter, + }, executors::{Executor, HasObservers}, fuzzer::{EvaluatorObservers, ExecutionProcessor}, inputs::Input, @@ -502,6 +505,12 @@ where OT: ObserversTuple, Z: ExecutionProcessor + EvaluatorObservers, //CE: CustomEvent, { + /// Gets the id assigned to this sender. + fn mgr_id(&self) -> EventManagerId { + EventManagerId { + id: self.llmp.sender.id as usize, + } + } } /// Serialize the current state and corpus during an executiont to bytes. diff --git a/libafl/src/events/mod.rs b/libafl/src/events/mod.rs index 14b54afcd2..d9fc047790 100644 --- a/libafl/src/events/mod.rs +++ b/libafl/src/events/mod.rs @@ -13,6 +13,20 @@ use crate::{ executors::ExitKind, inputs::Input, observers::ObserversTuple, stats::UserStats, Error, }; +/// A per-fuzzer unique ID, usually starting with `0` and increasing +/// by `1` in multiprocessed `EventManager`s, such as [`self::llmp::LlmpEventManager`]. +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct EventManagerId { + /// The id + pub id: usize, +} + +impl Default for EventManagerId { + fn default() -> Self { + Self { id: 0 } + } +} + #[cfg(feature = "introspection")] use crate::stats::ClientPerfStats; #[cfg(feature = "introspection")] @@ -240,12 +254,18 @@ pub trait EventProcessor { } /// [`EventManager`] is the main communications hub. -/// For the "normal" multi-processed mode, you may want to look into `RestartingEventManager` +/// For the "normal" multi-processed mode, you may want to look into [`RestartingEventManager`] pub trait EventManager: EventFirer + EventProcessor + EventRestarter where I: Input, { + /// The id of this `0` for + fn mgr_id(&self) -> EventManagerId { + EventManagerId { + ..EventManagerId::default() + } + } } /// An eventmgr for tests, and as placeholder if you really don't need an event manager.