panic_abort: Apply unsafe_op_in_unsafe_fn
This commit is contained in:
parent
4e36f46464
commit
e13928de93
3 changed files with 35 additions and 18 deletions
|
|
@ -16,9 +16,10 @@ type SetAbortMessageType = unsafe extern "C" fn(*const libc::c_char) -> ();
|
|||
// Weakly resolve the symbol for android_set_abort_message. This function is only available
|
||||
// for API >= 21.
|
||||
pub(crate) unsafe fn android_set_abort_message(payload: &mut dyn PanicPayload) {
|
||||
let func_addr =
|
||||
let func_addr = unsafe {
|
||||
libc::dlsym(libc::RTLD_DEFAULT, ANDROID_SET_ABORT_MESSAGE.as_ptr() as *const libc::c_char)
|
||||
as usize;
|
||||
as usize
|
||||
};
|
||||
if func_addr == 0 {
|
||||
return;
|
||||
}
|
||||
|
|
@ -37,13 +38,14 @@ pub(crate) unsafe fn android_set_abort_message(payload: &mut dyn PanicPayload) {
|
|||
|
||||
// Allocate a new buffer to append the null byte.
|
||||
let size = msg.len() + 1usize;
|
||||
let buf = libc::malloc(size) as *mut libc::c_char;
|
||||
let buf = unsafe { libc::malloc(size) as *mut libc::c_char };
|
||||
if buf.is_null() {
|
||||
return; // allocation failure
|
||||
}
|
||||
copy_nonoverlapping(msg.as_ptr(), buf as *mut u8, msg.len());
|
||||
buf.add(msg.len()).write(0);
|
||||
|
||||
let func = transmute::<usize, SetAbortMessageType>(func_addr);
|
||||
func(buf);
|
||||
unsafe {
|
||||
copy_nonoverlapping(msg.as_ptr(), buf as *mut u8, msg.len());
|
||||
buf.add(msg.len()).write(0);
|
||||
let func = transmute::<usize, SetAbortMessageType>(func_addr);
|
||||
func(buf);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
#![feature(staged_api)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![allow(internal_features)]
|
||||
#![deny(unsafe_op_in_unsafe_fn)]
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
mod android;
|
||||
|
|
@ -36,16 +37,22 @@ pub unsafe extern "C" fn __rust_panic_cleanup(_: *mut u8) -> *mut (dyn Any + Sen
|
|||
pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 {
|
||||
// Android has the ability to attach a message as part of the abort.
|
||||
#[cfg(target_os = "android")]
|
||||
android::android_set_abort_message(_payload);
|
||||
unsafe {
|
||||
android::android_set_abort_message(_payload);
|
||||
}
|
||||
#[cfg(target_os = "zkvm")]
|
||||
zkvm::zkvm_set_abort_message(_payload);
|
||||
unsafe {
|
||||
zkvm::zkvm_set_abort_message(_payload);
|
||||
}
|
||||
|
||||
abort();
|
||||
unsafe {
|
||||
abort();
|
||||
}
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(any(unix, target_os = "solid_asp3"))] {
|
||||
unsafe fn abort() -> ! {
|
||||
libc::abort();
|
||||
unsafe { libc::abort(); }
|
||||
}
|
||||
} else if #[cfg(any(target_os = "hermit",
|
||||
all(target_vendor = "fortanix", target_env = "sgx"),
|
||||
|
|
@ -57,7 +64,7 @@ pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 {
|
|||
unsafe extern "C" {
|
||||
pub fn __rust_abort() -> !;
|
||||
}
|
||||
__rust_abort();
|
||||
unsafe { __rust_abort(); }
|
||||
}
|
||||
} else if #[cfg(all(windows, not(miri)))] {
|
||||
// On Windows, use the processor-specific __fastfail mechanism. In Windows 8
|
||||
|
|
@ -75,11 +82,17 @@ pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 {
|
|||
const FAST_FAIL_FATAL_APP_EXIT: usize = 7;
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(any(target_arch = "x86", target_arch = "x86_64"))] {
|
||||
core::arch::asm!("int $$0x29", in("ecx") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
unsafe {
|
||||
core::arch::asm!("int $$0x29", in("ecx") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
}
|
||||
} else if #[cfg(all(target_arch = "arm", target_feature = "thumb-mode"))] {
|
||||
core::arch::asm!(".inst 0xDEFB", in("r0") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
unsafe {
|
||||
core::arch::asm!(".inst 0xDEFB", in("r0") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
}
|
||||
} else if #[cfg(any(target_arch = "aarch64", target_arch = "arm64ec"))] {
|
||||
core::arch::asm!("brk 0xF003", in("x0") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
unsafe {
|
||||
core::arch::asm!("brk 0xF003", in("x0") FAST_FAIL_FATAL_APP_EXIT, options(noreturn, nostack));
|
||||
}
|
||||
} else {
|
||||
core::intrinsics::abort();
|
||||
}
|
||||
|
|
@ -93,7 +106,7 @@ pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 {
|
|||
}
|
||||
|
||||
unsafe fn abort() -> ! {
|
||||
teeos::TEE_Panic(1);
|
||||
unsafe { teeos::TEE_Panic(1); }
|
||||
}
|
||||
} else {
|
||||
unsafe fn abort() -> ! {
|
||||
|
|
|
|||
|
|
@ -20,5 +20,7 @@ pub(crate) unsafe fn zkvm_set_abort_message(payload: &mut dyn PanicPayload) {
|
|||
fn sys_panic(msg_ptr: *const u8, len: usize) -> !;
|
||||
}
|
||||
|
||||
sys_panic(msg.as_ptr(), msg.len());
|
||||
unsafe {
|
||||
sys_panic(msg.as_ptr(), msg.len());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue