@@ -3,7 +3,7 @@ use std::{
3
3
str:: from_utf8_unchecked_mut,
4
4
} ;
5
5
6
- use libafl_bolts:: os:: unix_signals:: Signal ;
6
+ use libafl_bolts:: { Error , os:: unix_signals:: Signal } ;
7
7
use libafl_qemu_sys:: {
8
8
GuestAddr , GuestUsize , IntervalTreeNode , IntervalTreeRoot , MapInfo , MmapPerms , VerifyAccess ,
9
9
exec_path, free_self_maps, guest_base, libafl_force_dfl, libafl_get_brk,
@@ -324,18 +324,22 @@ impl Qemu {
324
324
}
325
325
326
326
#[ expect( clippy:: cast_sign_loss) ]
327
- fn mmap (
327
+ pub fn mmap (
328
328
self ,
329
329
addr : GuestAddr ,
330
330
size : usize ,
331
331
perms : MmapPerms ,
332
332
flags : c_int ,
333
- ) -> Result < GuestAddr , ( ) > {
333
+ fd : i32 ,
334
+ ) -> Result < GuestAddr , Error > {
334
335
let res = unsafe {
335
- libafl_qemu_sys:: target_mmap ( addr, size as GuestUsize , perms. into ( ) , flags, - 1 , 0 )
336
+ libafl_qemu_sys:: target_mmap ( addr, size as GuestUsize , perms. into ( ) , flags, fd , 0 )
336
337
} ;
337
338
if res <= 0 {
338
- Err ( ( ) )
339
+ let errno = std:: io:: Error :: last_os_error ( ) . raw_os_error ( ) ;
340
+ Err ( Error :: illegal_argument ( format ! (
341
+ "failed to mmap addr: {addr:x} (size: {size:?} prot: {perms:?} flags: {flags:?} fd: {fd:?}). The errno is {errno:?}" ,
342
+ ) ) )
339
343
} else {
340
344
Ok ( res as GuestAddr )
341
345
}
@@ -346,26 +350,29 @@ impl Qemu {
346
350
addr : GuestAddr ,
347
351
size : usize ,
348
352
perms : MmapPerms ,
349
- ) -> Result < GuestAddr , String > {
350
- self . mmap ( addr, size, perms, libc:: MAP_PRIVATE | libc:: MAP_ANONYMOUS )
351
- . map_err ( |( ) | format ! ( "Failed to map {addr}" ) )
352
- . map ( |addr| addr as GuestAddr )
353
+ ) -> Result < GuestAddr , Error > {
354
+ self . mmap (
355
+ addr,
356
+ size,
357
+ perms,
358
+ libc:: MAP_PRIVATE | libc:: MAP_ANONYMOUS ,
359
+ -1 ,
360
+ )
353
361
}
354
362
355
363
pub fn map_fixed (
356
364
& self ,
357
365
addr : GuestAddr ,
358
366
size : usize ,
359
367
perms : MmapPerms ,
360
- ) -> Result < GuestAddr , String > {
368
+ ) -> Result < GuestAddr , Error > {
361
369
self . mmap (
362
370
addr,
363
371
size,
364
372
perms,
365
373
libc:: MAP_FIXED | libc:: MAP_PRIVATE | libc:: MAP_ANONYMOUS ,
374
+ -1 ,
366
375
)
367
- . map_err ( |( ) | format ! ( "Failed to map {addr}" ) )
368
- . map ( |addr| addr as GuestAddr )
369
376
}
370
377
371
378
pub fn mprotect ( & self , addr : GuestAddr , size : usize , perms : MmapPerms ) -> Result < ( ) , String > {
@@ -532,7 +539,7 @@ pub mod pybind {
532
539
if let Ok ( p) = MmapPerms :: try_from ( perms) {
533
540
self . qemu
534
541
. map_private ( addr, size, p)
535
- . map_err ( PyValueError :: new_err)
542
+ . map_err ( |_| PyValueError :: new_err ( "Failed to mmap" ) )
536
543
} else {
537
544
Err ( PyValueError :: new_err ( "Invalid perms" ) )
538
545
}
@@ -541,8 +548,8 @@ pub mod pybind {
541
548
fn map_fixed ( & self , addr : GuestAddr , size : usize , perms : i32 ) -> PyResult < GuestAddr > {
542
549
if let Ok ( p) = MmapPerms :: try_from ( perms) {
543
550
self . qemu
544
- . map_fixed ( addr, size, p)
545
- . map_err ( PyValueError :: new_err)
551
+ . map_private ( addr, size, p)
552
+ . map_err ( |_| PyValueError :: new_err ( "Failed to mmap" ) )
546
553
} else {
547
554
Err ( PyValueError :: new_err ( "Invalid perms" ) )
548
555
}
0 commit comments