Skip to content

Commit c4ceb2a

Browse files
committed
Fix coverage collection
All edge maps represented as OwnedMutSlice need to point to the same underlying memory. In qemu mode, EDGES_MAP_PTR needs to point to the secondary edge map.
1 parent 8be3d2d commit c4ceb2a

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

src/main.rs

+25-10
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,10 @@ use libafl_bolts::{
4242
};
4343
#[cfg(feature = "qemu")]
4444
use libafl_qemu::{
45-
edges::QemuEdgeCoverageClassicHelper, elf::EasyElf, ArchExtras, CallingConvention, GuestAddr,
46-
GuestReg, MmapPerms, Qemu, QemuForkExecutor, QemuHooks, Regs,
45+
edges::{QemuEdgeCoverageClassicHelper, EDGES_MAP_PTR},
46+
elf::EasyElf,
47+
ArchExtras, CallingConvention, GuestAddr, GuestReg, MmapPerms, Qemu, QemuForkExecutor,
48+
QemuHooks, Regs,
4749
};
4850

4951
use corpus_syncer::CorpusSyncer;
@@ -254,24 +256,30 @@ fn main() -> std::process::ExitCode {
254256

255257
let mut primary_coverage_shmem = shmem_provider.new_shmem(MAX_MAP_SIZE).unwrap();
256258
let mut secondary_coverage_shmem = shmem_provider.new_shmem(MAX_MAP_SIZE).unwrap();
257-
let mut coverage_maps: Vec<OwnedMutSlice<'_, u8>> = unsafe {
258-
vec![
259-
OwnedMutSlice::from_raw_parts_mut(
259+
let (primary_edges, secondary_edges) = unsafe {
260+
(
261+
(
260262
primary_coverage_shmem.as_mut_ptr_of().unwrap(),
261263
primary_coverage_shmem.len(),
262264
),
263-
OwnedMutSlice::from_raw_parts_mut(
265+
(
264266
secondary_coverage_shmem.as_mut_ptr_of().unwrap(),
265267
secondary_coverage_shmem.len(),
266268
),
267-
]
269+
)
268270
};
269271

270272
// Create a coverage map observer for each executor
271273
let primary_map_observer =
272-
StdMapObserver::from_mut_slice("cov-observer-1", coverage_maps[0].clone());
273-
let secondary_map_observer =
274-
StdMapObserver::from_mut_slice("cov-observer-2", coverage_maps[1].clone());
274+
unsafe { StdMapObserver::from_mut_ptr("cov-observer-1", primary_edges.0, primary_edges.1) };
275+
let secondary_map_observer = unsafe {
276+
StdMapObserver::from_mut_ptr("cov-observer-2", secondary_edges.0, secondary_edges.1)
277+
};
278+
279+
#[cfg(feature = "qemu")]
280+
unsafe {
281+
EDGES_MAP_PTR = secondary_edges.0
282+
};
275283

276284
let primary_executor = ForkserverExecutor::builder()
277285
.program(PathBuf::from(&opts.primary))
@@ -359,6 +367,13 @@ fn main() -> std::process::ExitCode {
359367

360368
match &opts.command {
361369
Command::Fuzz(fuzz_opts) => {
370+
let mut coverage_maps: Vec<OwnedMutSlice<'_, u8>> = unsafe {
371+
vec![
372+
OwnedMutSlice::from_raw_parts_mut(primary_edges.0, primary_edges.1),
373+
OwnedMutSlice::from_raw_parts_mut(secondary_edges.0, secondary_edges.1),
374+
]
375+
};
376+
362377
// Resize the coverage maps according to the dynamic map size determined by the executors
363378
coverage_maps[0].truncate(primary_executor.coverage_map_size().unwrap());
364379
println!(

0 commit comments

Comments
 (0)