Fix metadata addition when solution is found (#3069)

* fix

* fixer
This commit is contained in:
Dongjia "toka" Zhang 2025-03-12 13:57:06 +01:00 committed by GitHub
parent 63e82d898e
commit f3da9da7bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 8 additions and 2 deletions

View File

@ -52,6 +52,7 @@ pub fn fuzz() {
unsafe { unsafe {
RegistryBuilder::register::<MapFeedbackMetadata<u8>>(); RegistryBuilder::register::<MapFeedbackMetadata<u8>>();
RegistryBuilder::register::<RetryCountRestartHelper>(); RegistryBuilder::register::<RetryCountRestartHelper>();
RegistryBuilder::register::<ExitKind>();
} }
let mut signals = [0u8; 64]; let mut signals = [0u8; 64];

View File

@ -15,7 +15,7 @@ use core::{
use libafl_bolts::tuples::{RefIndexable, tuple_list}; use libafl_bolts::tuples::{RefIndexable, tuple_list};
use crate::{ use crate::{
Error, Error, HasMetadata,
corpus::{Corpus, Testcase}, corpus::{Corpus, Testcase},
events::{Event, EventFirer, EventRestarter}, events::{Event, EventFirer, EventRestarter},
executors::{ executors::{
@ -345,6 +345,7 @@ pub fn run_observers_and_save_state<E, EM, I, OF, S, Z>(
if is_solution { if is_solution {
let mut new_testcase = Testcase::from(input.clone()); let mut new_testcase = Testcase::from(input.clone());
new_testcase.add_metadata(exitkind);
new_testcase.set_parent_id_optional(*state.corpus().current()); new_testcase.set_parent_id_optional(*state.corpus().current());
if let Ok(mut tc) = state.current_testcase_mut() { if let Ok(mut tc) = state.current_testcase_mut() {

View File

@ -94,6 +94,7 @@ pub trait ExecutionProcessor<EM, I, OT, S> {
manager: &mut EM, manager: &mut EM,
input: &I, input: &I,
exec_res: &ExecuteInputResult, exec_res: &ExecuteInputResult,
exit_kind: &ExitKind,
observers: &OT, observers: &OT,
) -> Result<Option<CorpusId>, Error>; ) -> Result<Option<CorpusId>, Error>;
@ -409,6 +410,7 @@ where
manager: &mut EM, manager: &mut EM,
input: &I, input: &I,
exec_res: &ExecuteInputResult, exec_res: &ExecuteInputResult,
exit_kind: &ExitKind,
observers: &OT, observers: &OT,
) -> Result<Option<CorpusId>, Error> { ) -> Result<Option<CorpusId>, Error> {
let corpus = if exec_res.is_corpus() { let corpus = if exec_res.is_corpus() {
@ -429,6 +431,7 @@ where
if exec_res.is_solution() { if exec_res.is_solution() {
// The input is a solution, add it to the respective corpus // The input is a solution, add it to the respective corpus
let mut testcase = Testcase::from(input.clone()); let mut testcase = Testcase::from(input.clone());
testcase.add_metadata(*exit_kind);
testcase.set_parent_id_optional(*state.corpus().current()); testcase.set_parent_id_optional(*state.corpus().current());
if let Ok(mut tc) = state.current_testcase_mut() { if let Ok(mut tc) = state.current_testcase_mut() {
tc.found_objective(); tc.found_objective();
@ -519,7 +522,8 @@ where
send_events: bool, send_events: bool,
) -> Result<(ExecuteInputResult, Option<CorpusId>), Error> { ) -> Result<(ExecuteInputResult, Option<CorpusId>), Error> {
let exec_res = self.check_results(state, manager, input, observers, exit_kind)?; let exec_res = self.check_results(state, manager, input, observers, exit_kind)?;
let corpus_id = self.process_execution(state, manager, input, &exec_res, observers)?; let corpus_id =
self.process_execution(state, manager, input, &exec_res, exit_kind, observers)?;
if send_events { if send_events {
self.serialize_and_dispatch(state, manager, input, &exec_res, observers, exit_kind)?; self.serialize_and_dispatch(state, manager, input, &exec_res, observers, exit_kind)?;
} }