@@ -42,8 +42,10 @@ use libafl_bolts::{
42
42
} ;
43
43
#[ cfg( feature = "qemu" ) ]
44
44
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 ,
47
49
} ;
48
50
49
51
use corpus_syncer:: CorpusSyncer ;
@@ -254,24 +256,30 @@ fn main() -> std::process::ExitCode {
254
256
255
257
let mut primary_coverage_shmem = shmem_provider. new_shmem ( MAX_MAP_SIZE ) . unwrap ( ) ;
256
258
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
+ (
260
262
primary_coverage_shmem. as_mut_ptr_of ( ) . unwrap ( ) ,
261
263
primary_coverage_shmem. len ( ) ,
262
264
) ,
263
- OwnedMutSlice :: from_raw_parts_mut (
265
+ (
264
266
secondary_coverage_shmem. as_mut_ptr_of ( ) . unwrap ( ) ,
265
267
secondary_coverage_shmem. len ( ) ,
266
268
) ,
267
- ]
269
+ )
268
270
} ;
269
271
270
272
// Create a coverage map observer for each executor
271
273
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
+ } ;
275
283
276
284
let primary_executor = ForkserverExecutor :: builder ( )
277
285
. program ( PathBuf :: from ( & opts. primary ) )
@@ -359,6 +367,13 @@ fn main() -> std::process::ExitCode {
359
367
360
368
match & opts. command {
361
369
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
+
362
377
// Resize the coverage maps according to the dynamic map size determined by the executors
363
378
coverage_maps[ 0 ] . truncate ( primary_executor. coverage_map_size ( ) . unwrap ( ) ) ;
364
379
println ! (
0 commit comments