diff --git a/bindings/rust/src/ffi.rs b/bindings/rust/src/ffi.rs index 7f7a205b..d812e8cd 100644 --- a/bindings/rust/src/ffi.rs +++ b/bindings/rust/src/ffi.rs @@ -121,9 +121,15 @@ pub unsafe extern "C" fn mmio_read_callback_proxy( where F: FnMut(&mut crate::Unicorn, u64, usize) -> u64, { + if user_data.is_null() { + return 0; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return 0; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, offset, size) @@ -138,9 +144,15 @@ pub unsafe extern "C" fn mmio_write_callback_proxy( ) where F: FnMut(&mut crate::Unicorn, u64, usize, u64), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, offset, size, value); @@ -154,9 +166,15 @@ pub unsafe extern "C" fn code_hook_proxy( ) where F: FnMut(&mut crate::Unicorn, u64, u32), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, address, size); @@ -170,9 +188,15 @@ pub unsafe extern "C" fn block_hook_proxy( ) where F: FnMut(&mut crate::Unicorn, u64, u32), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, address, size); @@ -189,9 +213,15 @@ pub unsafe extern "C" fn mem_hook_proxy( where F: FnMut(&mut crate::Unicorn, MemType, u64, usize, i64) -> bool, { + if user_data.is_null() { + return false; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return false; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, mem_type, address, size as usize, value) @@ -204,9 +234,15 @@ pub unsafe extern "C" fn intr_hook_proxy( ) where F: FnMut(&mut crate::Unicorn, u32), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, value); @@ -221,9 +257,15 @@ pub unsafe extern "C" fn insn_in_hook_proxy( where F: FnMut(&mut crate::Unicorn, u32, usize) -> u32, { + if user_data.is_null() { + return 0; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return 0; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, port, size) @@ -236,9 +278,15 @@ pub unsafe extern "C" fn insn_invalid_hook_proxy( where F: FnMut(&mut crate::Unicorn) -> bool, { + if user_data.is_null() { + return false; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return false; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc) @@ -253,9 +301,15 @@ pub unsafe extern "C" fn insn_out_hook_proxy( ) where F: FnMut(&mut crate::Unicorn, u32, usize, u32), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc, port, size, value); @@ -265,9 +319,15 @@ pub unsafe extern "C" fn insn_sys_hook_proxy(uc: uc_handle, user_data: *mu where F: FnMut(&mut crate::Unicorn), { + if user_data.is_null() { + return; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); (user_data.callback)(&mut user_data_uc); @@ -283,9 +343,15 @@ pub unsafe extern "C" fn tlb_lookup_hook_proxy( where F: FnMut(&mut crate::Unicorn, u64, MemType) -> Option, { + if user_data.is_null() { + return false; + } let user_data = &mut *user_data; + let Some(inner) = user_data.uc.upgrade() else { + return false; + }; let mut user_data_uc = Unicorn { - inner: user_data.uc.upgrade().unwrap(), + inner, }; debug_assert_eq!(uc, user_data_uc.get_handle()); let r = (user_data.callback)(&mut user_data_uc, vaddr, mem_type);