diff --git a/fuzzers/FRET/src/systemstate/helpers.rs b/fuzzers/FRET/src/systemstate/helpers.rs index 34b0b53457..f3716fb6c3 100644 --- a/fuzzers/FRET/src/systemstate/helpers.rs +++ b/fuzzers/FRET/src/systemstate/helpers.rs @@ -206,7 +206,7 @@ where } } -fn read_freertos_list(systemstate : &mut RawFreeRTOSSystemState, emulator: &libafl_qemu::Qemu, target: GuestAddr) -> freertos::List_t { +fn read_freertos_list(systemstate : &mut RawFreeRTOSSystemState, emulator: &libafl_qemu::Qemu, target: GuestAddr) -> (freertos::List_t, bool) { let read : freertos::List_t = freertos::emu_lookup::lookup(emulator, target); let listbytes : GuestAddr = GuestAddr::try_from(std::mem::size_of::()).unwrap(); @@ -226,7 +226,7 @@ fn read_freertos_list(systemstate : &mut RawFreeRTOSSystemState, emulator: &liba eprintln!("Warning: attempted to read a list that is being modified"); let mut read=read; read.uxNumberOfItems = 0; - return read; + return (read, false); } // assert_eq!(next_item.pvContainer,target); let new_next_index=next_item.pxNext; @@ -241,7 +241,7 @@ fn read_freertos_list(systemstate : &mut RawFreeRTOSSystemState, emulator: &liba let next_item : freertos::MiniListItem_t = freertos::emu_lookup::lookup(emulator, next_index); systemstate.dumping_ground.insert(next_index,List_MiniItem_struct(next_item)); } - return read; + return (read, true); } #[inline] @@ -300,18 +300,31 @@ fn trigger_collection(emulator: &libafl_qemu::Qemu, edge: (GuestAddr, GuestAddr) // Extract delay list let mut target : GuestAddr = h.delay_queue; target = freertos::emu_lookup::lookup(emulator, target); - systemstate.delay_list = read_freertos_list(&mut systemstate, emulator, target); + let _temp = read_freertos_list(&mut systemstate, emulator, target); + systemstate.delay_list = _temp.0; + systemstate.read_invalid |= !_temp.1; // Extract delay list overflow let mut target : GuestAddr = h.delay_queue_overflow; target = freertos::emu_lookup::lookup(emulator, target); - systemstate.delay_list_overflow = read_freertos_list(&mut systemstate, emulator, target); + let _temp = read_freertos_list(&mut systemstate, emulator, target); + systemstate.delay_list_overflow = _temp.0; + systemstate.read_invalid |= !_temp.1; + + // Extract suspended tasks (infinite wait), seems broken, always appreas to be modified + // let mut target : GuestAddr = h.suspended_queue; + // target = freertos::emu_lookup::lookup(emulator, target); + // systemstate.suspended_list = read_freertos_list(&mut systemstate, emulator, target); // Extract priority lists for i in 0..NUM_PRIOS { let target : GuestAddr = listbytes*GuestAddr::try_from(i).unwrap()+h.ready_queues; - systemstate.prio_ready_lists[i] = read_freertos_list(&mut systemstate, emulator, target); + let _temp = read_freertos_list(&mut systemstate, emulator, target); + systemstate.prio_ready_lists[i] = _temp.0; + systemstate.read_invalid |= !_temp.1; } + } else { + systemstate.read_invalid = true; } systemstate.mem_reads = unsafe { MEM_READ.take().unwrap_or_default() }; diff --git a/fuzzers/FRET/src/systemstate/mod.rs b/fuzzers/FRET/src/systemstate/mod.rs index 25c4769b02..6d3c4e0417 100644 --- a/fuzzers/FRET/src/systemstate/mod.rs +++ b/fuzzers/FRET/src/systemstate/mod.rs @@ -46,6 +46,7 @@ pub struct RawFreeRTOSSystemState { delay_list: freertos::List_t, delay_list_overflow: freertos::List_t, dumping_ground: HashMap, + read_invalid: bool, input_counter: u32, edge: (GuestAddr,GuestAddr), capture_point: (CaptureEvent,String), @@ -125,6 +126,7 @@ pub struct ReducedFreeRTOSSystemState { pub current_task: RefinedTCB, ready_list_after: Vec, delay_list_after: Vec, + read_invalid: bool, // edge: (Option,Option), // pub capture_point: (CaptureEvent,String), // input_counter: u32 @@ -132,7 +134,7 @@ pub struct ReducedFreeRTOSSystemState { impl PartialEq for ReducedFreeRTOSSystemState { fn eq(&self, other: &Self) -> bool { self.current_task == other.current_task && self.ready_list_after == other.ready_list_after && - self.delay_list_after == other.delay_list_after + self.delay_list_after == other.delay_list_after && self.read_invalid == other.read_invalid // && self.edge == other.edge // && self.capture_point == other.capture_point } @@ -143,6 +145,7 @@ impl Hash for ReducedFreeRTOSSystemState { self.current_task.hash(state); self.ready_list_after.hash(state); self.delay_list_after.hash(state); + self.read_invalid.hash(state); } } impl ReducedFreeRTOSSystemState { diff --git a/fuzzers/FRET/src/systemstate/observers.rs b/fuzzers/FRET/src/systemstate/observers.rs index 9364d90cbe..15e8bbc722 100644 --- a/fuzzers/FRET/src/systemstate/observers.rs +++ b/fuzzers/FRET/src/systemstate/observers.rs @@ -211,6 +211,7 @@ fn refine_system_states(mut input: Vec) -> (Vec, states: &HashMap