Skip to content

Commit 184b69b

Browse files
authored
Update QEMU syshook ret value (#3092)
* update syshook ret value
1 parent c68b30a commit 184b69b

File tree

12 files changed

+178
-145
lines changed

12 files changed

+178
-145
lines changed

libafl_qemu/libafl_qemu_build/src/build.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::cargo_add_rpath;
1111

1212
pub const QEMU_URL: &str = "https://github.com/AFLplusplus/qemu-libafl-bridge";
1313
pub const QEMU_DIRNAME: &str = "qemu-libafl-bridge";
14-
pub const QEMU_REVISION: &str = "2a676d9cd8c474b5c0db1d77d2769e56e2ed8524";
14+
pub const QEMU_REVISION: &str = "97bef506eed24ee8d0eda4a07c4419c55dae4acb";
1515

1616
pub struct BuildResult {
1717
pub qemu_path: PathBuf,

libafl_qemu/libafl_qemu_sys/src/bindings/x86_64_stub_bindings.rs

+121-74
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* 1.87.0-nightly */
2-
/* qemu git hash: 2a676d9cd8c474b5c0db1d77d2769e56e2ed8524 */
2+
/* qemu git hash: 97bef506eed24ee8d0eda4a07c4419c55dae4acb */
33
/* automatically generated by rust-bindgen 0.71.1 */
44

55
use libc::siginfo_t;
@@ -8687,37 +8687,131 @@ unsafe extern "C" {
86878687
unsafe extern "C" {
86888688
pub fn libafl_hook_new_thread_run(env: *mut CPUArchState, tid: u32) -> bool;
86898689
}
8690+
pub const libafl_syshook_ret_tag_LIBAFL_SYSHOOK_RUN: libafl_syshook_ret_tag =
8691+
libafl_syshook_ret_tag(0);
8692+
pub const libafl_syshook_ret_tag_LIBAFL_SYSHOOK_SKIP: libafl_syshook_ret_tag =
8693+
libafl_syshook_ret_tag(1);
8694+
impl ::std::ops::BitOr<libafl_syshook_ret_tag> for libafl_syshook_ret_tag {
8695+
type Output = Self;
8696+
#[inline]
8697+
fn bitor(self, other: Self) -> Self {
8698+
libafl_syshook_ret_tag(self.0 | other.0)
8699+
}
8700+
}
8701+
impl ::std::ops::BitOrAssign for libafl_syshook_ret_tag {
8702+
#[inline]
8703+
fn bitor_assign(&mut self, rhs: libafl_syshook_ret_tag) {
8704+
self.0 |= rhs.0;
8705+
}
8706+
}
8707+
impl ::std::ops::BitAnd<libafl_syshook_ret_tag> for libafl_syshook_ret_tag {
8708+
type Output = Self;
8709+
#[inline]
8710+
fn bitand(self, other: Self) -> Self {
8711+
libafl_syshook_ret_tag(self.0 & other.0)
8712+
}
8713+
}
8714+
impl ::std::ops::BitAndAssign for libafl_syshook_ret_tag {
8715+
#[inline]
8716+
fn bitand_assign(&mut self, rhs: libafl_syshook_ret_tag) {
8717+
self.0 &= rhs.0;
8718+
}
8719+
}
8720+
#[repr(transparent)]
8721+
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
8722+
pub struct libafl_syshook_ret_tag(pub ::std::os::raw::c_uint);
86908723
#[repr(C)]
8691-
#[derive(Debug, Default, Copy, Clone)]
8692-
pub struct syshook_ret {
8693-
pub retval: target_ulong,
8694-
pub skip_syscall: bool,
8724+
#[derive(Copy, Clone)]
8725+
pub struct libafl_syshook_ret {
8726+
pub tag: libafl_syshook_ret_tag,
8727+
pub __bindgen_anon_1: libafl_syshook_ret__bindgen_ty_1,
8728+
}
8729+
#[repr(C)]
8730+
#[derive(Copy, Clone)]
8731+
pub union libafl_syshook_ret__bindgen_ty_1 {
8732+
pub syshook_skip_retval: target_ulong,
86958733
}
86968734
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
86978735
const _: () = {
8698-
["Size of syshook_ret"][::std::mem::size_of::<syshook_ret>() - 16usize];
8699-
["Alignment of syshook_ret"][::std::mem::align_of::<syshook_ret>() - 8usize];
8700-
["Offset of field: syshook_ret::retval"][::std::mem::offset_of!(syshook_ret, retval) - 0usize];
8701-
["Offset of field: syshook_ret::skip_syscall"]
8702-
[::std::mem::offset_of!(syshook_ret, skip_syscall) - 8usize];
8736+
["Size of libafl_syshook_ret__bindgen_ty_1"]
8737+
[::std::mem::size_of::<libafl_syshook_ret__bindgen_ty_1>() - 8usize];
8738+
["Alignment of libafl_syshook_ret__bindgen_ty_1"]
8739+
[::std::mem::align_of::<libafl_syshook_ret__bindgen_ty_1>() - 8usize];
8740+
["Offset of field: libafl_syshook_ret__bindgen_ty_1::syshook_skip_retval"]
8741+
[::std::mem::offset_of!(libafl_syshook_ret__bindgen_ty_1, syshook_skip_retval) - 0usize];
87038742
};
8743+
impl Default for libafl_syshook_ret__bindgen_ty_1 {
8744+
fn default() -> Self {
8745+
let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
8746+
unsafe {
8747+
::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
8748+
s.assume_init()
8749+
}
8750+
}
8751+
}
8752+
impl ::std::fmt::Debug for libafl_syshook_ret__bindgen_ty_1 {
8753+
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8754+
write!(f, "libafl_syshook_ret__bindgen_ty_1 {{ union }}")
8755+
}
8756+
}
8757+
#[allow(clippy::unnecessary_operation, clippy::identity_op)]
8758+
const _: () = {
8759+
["Size of libafl_syshook_ret"][::std::mem::size_of::<libafl_syshook_ret>() - 16usize];
8760+
["Alignment of libafl_syshook_ret"][::std::mem::align_of::<libafl_syshook_ret>() - 8usize];
8761+
["Offset of field: libafl_syshook_ret::tag"]
8762+
[::std::mem::offset_of!(libafl_syshook_ret, tag) - 0usize];
8763+
};
8764+
impl Default for libafl_syshook_ret {
8765+
fn default() -> Self {
8766+
let mut s = ::std::mem::MaybeUninit::<Self>::uninit();
8767+
unsafe {
8768+
::std::ptr::write_bytes(s.as_mut_ptr(), 0, 1);
8769+
s.assume_init()
8770+
}
8771+
}
8772+
}
8773+
impl ::std::fmt::Debug for libafl_syshook_ret {
8774+
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
8775+
write!(
8776+
f,
8777+
"libafl_syshook_ret {{ tag: {:?}, __bindgen_anon_1: {:?} }}",
8778+
self.tag, self.__bindgen_anon_1
8779+
)
8780+
}
8781+
}
8782+
pub type libafl_pre_syscall_cb = ::std::option::Option<
8783+
unsafe extern "C" fn(
8784+
data: u64,
8785+
sys_num: ::std::os::raw::c_int,
8786+
arg0: target_ulong,
8787+
arg1: target_ulong,
8788+
arg2: target_ulong,
8789+
arg3: target_ulong,
8790+
arg4: target_ulong,
8791+
arg5: target_ulong,
8792+
arg6: target_ulong,
8793+
arg7: target_ulong,
8794+
) -> libafl_syshook_ret,
8795+
>;
8796+
pub type libafl_post_syscall_cb = ::std::option::Option<
8797+
unsafe extern "C" fn(
8798+
data: u64,
8799+
ret: target_ulong,
8800+
sys_num: ::std::os::raw::c_int,
8801+
arg0: target_ulong,
8802+
arg1: target_ulong,
8803+
arg2: target_ulong,
8804+
arg3: target_ulong,
8805+
arg4: target_ulong,
8806+
arg5: target_ulong,
8807+
arg6: target_ulong,
8808+
arg7: target_ulong,
8809+
) -> target_ulong,
8810+
>;
87048811
#[repr(C)]
87058812
#[derive(Debug, Copy, Clone)]
87068813
pub struct libafl_pre_syscall_hook {
8707-
pub callback: ::std::option::Option<
8708-
unsafe extern "C" fn(
8709-
data: u64,
8710-
sys_num: ::std::os::raw::c_int,
8711-
arg0: target_ulong,
8712-
arg1: target_ulong,
8713-
arg2: target_ulong,
8714-
arg3: target_ulong,
8715-
arg4: target_ulong,
8716-
arg5: target_ulong,
8717-
arg6: target_ulong,
8718-
arg7: target_ulong,
8719-
) -> syshook_ret,
8720-
>,
8814+
pub callback: libafl_pre_syscall_cb,
87218815
pub data: u64,
87228816
pub num: usize,
87238817
pub next: *mut libafl_pre_syscall_hook,
@@ -8748,21 +8842,7 @@ impl Default for libafl_pre_syscall_hook {
87488842
#[repr(C)]
87498843
#[derive(Debug, Copy, Clone)]
87508844
pub struct libafl_post_syscall_hook {
8751-
pub callback: ::std::option::Option<
8752-
unsafe extern "C" fn(
8753-
data: u64,
8754-
ret: target_ulong,
8755-
sys_num: ::std::os::raw::c_int,
8756-
arg0: target_ulong,
8757-
arg1: target_ulong,
8758-
arg2: target_ulong,
8759-
arg3: target_ulong,
8760-
arg4: target_ulong,
8761-
arg5: target_ulong,
8762-
arg6: target_ulong,
8763-
arg7: target_ulong,
8764-
) -> target_ulong,
8765-
>,
8845+
pub callback: libafl_post_syscall_cb,
87668846
pub data: u64,
87678847
pub num: usize,
87688848
pub next: *mut libafl_post_syscall_hook,
@@ -8792,43 +8872,10 @@ impl Default for libafl_post_syscall_hook {
87928872
}
87938873
}
87948874
unsafe extern "C" {
8795-
pub fn libafl_add_pre_syscall_hook(
8796-
callback: ::std::option::Option<
8797-
unsafe extern "C" fn(
8798-
data: u64,
8799-
sys_num: ::std::os::raw::c_int,
8800-
arg0: target_ulong,
8801-
arg1: target_ulong,
8802-
arg2: target_ulong,
8803-
arg3: target_ulong,
8804-
arg4: target_ulong,
8805-
arg5: target_ulong,
8806-
arg6: target_ulong,
8807-
arg7: target_ulong,
8808-
) -> syshook_ret,
8809-
>,
8810-
data: u64,
8811-
) -> usize;
8875+
pub fn libafl_add_pre_syscall_hook(callback: libafl_pre_syscall_cb, data: u64) -> usize;
88128876
}
88138877
unsafe extern "C" {
8814-
pub fn libafl_add_post_syscall_hook(
8815-
callback: ::std::option::Option<
8816-
unsafe extern "C" fn(
8817-
data: u64,
8818-
ret: target_ulong,
8819-
sys_num: ::std::os::raw::c_int,
8820-
arg0: target_ulong,
8821-
arg1: target_ulong,
8822-
arg2: target_ulong,
8823-
arg3: target_ulong,
8824-
arg4: target_ulong,
8825-
arg5: target_ulong,
8826-
arg6: target_ulong,
8827-
arg7: target_ulong,
8828-
) -> target_ulong,
8829-
>,
8830-
data: u64,
8831-
) -> usize;
8878+
pub fn libafl_add_post_syscall_hook(callback: libafl_post_syscall_cb, data: u64) -> usize;
88328879
}
88338880
unsafe extern "C" {
88348881
pub fn libafl_qemu_remove_pre_syscall_hook(num: usize) -> ::std::os::raw::c_int;

libafl_qemu/runtime/libafl_qemu_stub_bindings.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* 1.87.0-nightly */
2-
/* qemu git hash: 2a676d9cd8c474b5c0db1d77d2769e56e2ed8524 */
2+
/* qemu git hash: 97bef506eed24ee8d0eda4a07c4419c55dae4acb */
33
/* automatically generated by rust-bindgen 0.71.1 */
44

55
#[repr(C)]

libafl_qemu/runtime/nyx_stub_bindings.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* 1.87.0-nightly */
2-
/* qemu git hash: 2a676d9cd8c474b5c0db1d77d2769e56e2ed8524 */
2+
/* qemu git hash: 97bef506eed24ee8d0eda4a07c4419c55dae4acb */
33
/* automatically generated by rust-bindgen 0.71.1 */
44

55
#[repr(C)]

libafl_qemu/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ pub fn python_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
9898
#[cfg(feature = "usermode")]
9999
m.add_class::<GuestMaps>()?;
100100

101-
m.add_class::<SyscallHookResult>()?;
101+
m.add_class::<pybind::SyscallHookResult>()?;
102102
m.add_class::<pybind::Qemu>()?;
103103

104104
Ok(())

libafl_qemu/src/modules/usermode/asan.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,9 @@ impl AsanGiovese {
578578
}
579579
_ => (),
580580
}
581-
SyscallHookResult::new(Some(r))
581+
SyscallHookResult::Skip(r)
582582
} else {
583-
SyscallHookResult::new(None)
583+
SyscallHookResult::Run
584584
}
585585
}
586586

@@ -1350,9 +1350,9 @@ where
13501350
}
13511351
_ => (),
13521352
}
1353-
SyscallHookResult::new(Some(0))
1353+
SyscallHookResult::Skip(0)
13541354
} else {
1355-
SyscallHookResult::new(None)
1355+
SyscallHookResult::Run
13561356
}
13571357
}
13581358

libafl_qemu/src/modules/usermode/injections.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -400,13 +400,13 @@ where
400400

401401
let first_parameter = unsafe {
402402
if (*c_array.offset(1)).is_null() {
403-
return SyscallHookResult::new(None);
403+
return SyscallHookResult::Run;
404404
}
405405
CStr::from_ptr(*c_array.offset(1)).to_string_lossy()
406406
};
407407
let second_parameter = unsafe {
408408
if (*c_array.offset(2)).is_null() {
409-
return SyscallHookResult::new(None);
409+
return SyscallHookResult::Run;
410410
}
411411
CStr::from_ptr(*c_array.offset(2)).to_string_lossy()
412412
};
@@ -419,9 +419,9 @@ where
419419

420420
//println!("PARAMETERS First {} Second {}", first_parameter, second_
421421
}
422-
SyscallHookResult::new(Some(0))
422+
SyscallHookResult::Skip(0)
423423
} else {
424-
SyscallHookResult::new(None)
424+
SyscallHookResult::Run
425425
}
426426
}
427427

libafl_qemu/src/modules/usermode/redirect_stdin.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ where
114114
{
115115
let h = emulator_modules.get_mut::<RedirectStdinModule>().unwrap();
116116
if h.input_addr.is_null() {
117-
return SyscallHookResult::new(None);
117+
return SyscallHookResult::Run;
118118
}
119119
if syscall == SYS_read as i32 && x0 == 0 {
120120
/*
@@ -143,7 +143,7 @@ where
143143
};
144144
// println!("copied {}", size);
145145
h.read += size as usize;
146-
return SyscallHookResult::new(Some(size));
146+
return SyscallHookResult::Skip(size);
147147
}
148-
SyscallHookResult::new(None)
148+
SyscallHookResult::Run
149149
}

libafl_qemu/src/modules/usermode/snapshot.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -888,11 +888,11 @@ where
888888
if i64::from(sys_num) == SYS_munmap {
889889
let h = emulator_modules.get_mut::<SnapshotModule>().unwrap();
890890
if !h.is_unmap_allowed(a0 as GuestAddr, a1 as usize) {
891-
return SyscallHookResult::new(Some(0));
891+
return SyscallHookResult::Skip(0);
892892
}
893893
}
894894

895-
SyscallHookResult::new(None)
895+
SyscallHookResult::Run
896896
}
897897

898898
#[expect(non_upper_case_globals, clippy::too_many_arguments)]

0 commit comments

Comments
 (0)