From 4e40dc538c06fc6ddcca72a09afde0c2e5ff4a32 Mon Sep 17 00:00:00 2001 From: Red Bear OS Date: Sun, 28 Jun 2026 04:00:30 +0300 Subject: [PATCH] abort: raise(SIGABRT) + _Exit instead of ud2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously abort() called core::intrinsics::abort() which compiles to the ud2 instruction, generating an Invalid Opcode fault. The kernel logs this as 'UNHANDLED EXCEPTION' and kills the process, but the fault message is alarming and doesn't reflect the actual intent (SIGABRT from process self-termination). This change uses the POSIX-compliant abort sequence: raise(SIGABRT) first (default handler terminates the process), then _Exit(134) as fallback if the signal handler returns. Six sites updated: stdlib abort, assert __assert_fail, lib.rs relibc_panic/oom/_Unwind_Resume, start.rs relibc_verify_host. The proc-manager-fallback in redox-rt/src/sys.rs retains core::intrinsics::abort() — that path is a true 'system unreachable' last resort where raise/_Exit cannot succeed. --- src/header/assert/mod.rs | 2 +- src/header/stdlib/mod.rs | 3 ++- src/lib.rs | 6 +++--- src/start.rs | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/header/assert/mod.rs b/src/header/assert/mod.rs index 208d9019ae..d3f9f78743 100644 --- a/src/header/assert/mod.rs +++ b/src/header/assert/mod.rs @@ -20,5 +20,5 @@ pub unsafe extern "C" fn __assert_fail( eprintln!("{}: {}:{}: Assertion `{}` failed.", func, file, line, cond); - core::intrinsics::abort(); + crate::header::stdlib::abort(); } diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs index 96f9611aa9..62d59a7d48 100644 --- a/src/header/stdlib/mod.rs +++ b/src/header/stdlib/mod.rs @@ -117,7 +117,8 @@ pub unsafe extern "C" fn a64l(s: *const c_char) -> c_long { #[unsafe(no_mangle)] pub unsafe extern "C" fn abort() -> ! { log::error!("Abort"); - intrinsics::abort(); + crate::header::signal::raise(crate::header::signal::redox::SIGABRT as c_int); + _Exit(128 + crate::header::signal::redox::SIGABRT as c_int); } #[cfg(not(target_pointer_width = "64"))] diff --git a/src/lib.rs b/src/lib.rs index ea853da6e4..2bf6b04fe3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,7 +69,7 @@ pub extern "C" fn relibc_panic(pi: &::core::panic::PanicInfo) -> ! { let mut w = platform::FileWriter::new(2); let _ = w.write_fmt(format_args!("RELIBC PANIC: {}\n", pi)); - core::intrinsics::abort(); + crate::header::stdlib::abort(); } #[cfg(not(test))] @@ -100,7 +100,7 @@ pub extern "C" fn rust_oom(layout: ::core::alloc::Layout) -> ! { layout.align() )); - core::intrinsics::abort(); + crate::header::stdlib::abort(); } #[cfg(not(test))] @@ -113,5 +113,5 @@ pub extern "C" fn _Unwind_Resume() -> ! { let mut w = platform::FileWriter::new(2); let _ = w.write_str("_Unwind_Resume\n"); - core::intrinsics::abort(); + crate::header::stdlib::abort(); } diff --git a/src/start.rs b/src/start.rs index 63d404607b..52b5bc20f4 100644 --- a/src/start.rs +++ b/src/start.rs @@ -78,7 +78,7 @@ unsafe fn copy_string_array(array: *const *const c_char, len: usize) -> Vec<*mut #[unsafe(no_mangle)] pub unsafe fn relibc_verify_host() { if !Sys::verify() { - intrinsics::abort(); + stdlib::abort(); } } #[unsafe(link_section = ".init_array")]