From 5925ef02bfb101df8da6e2ee0283166d4274b5b5 Mon Sep 17 00:00:00 2001 From: weitengchen Date: Wed, 18 Feb 2026 13:30:00 -0800 Subject: [PATCH 1/2] fix sigreturn for x86 --- litebox_shim_linux/src/syscalls/signal/mod.rs | 2 +- litebox_shim_linux/src/syscalls/signal/x86.rs | 13 +++++++------ litebox_shim_linux/src/syscalls/signal/x86_64.rs | 10 +++++----- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/litebox_shim_linux/src/syscalls/signal/mod.rs b/litebox_shim_linux/src/syscalls/signal/mod.rs index 9c21bb1c90..5ba96786d2 100644 --- a/litebox_shim_linux/src/syscalls/signal/mod.rs +++ b/litebox_shim_linux/src/syscalls/signal/mod.rs @@ -355,7 +355,7 @@ impl SignalState { sp }; - let frame_addr = arch::get_signal_frame(sp, action); + let frame_addr = arch::get_signal_frame(sp, action).ok_or(DeliverFault)?; if (switch_stacks || on_alt_stack) && !is_on_stack(&altstack, frame_addr) { return Err(DeliverFault); diff --git a/litebox_shim_linux/src/syscalls/signal/x86.rs b/litebox_shim_linux/src/syscalls/signal/x86.rs index 34c6872dc9..53e217cf26 100644 --- a/litebox_shim_linux/src/syscalls/signal/x86.rs +++ b/litebox_shim_linux/src/syscalls/signal/x86.rs @@ -42,7 +42,8 @@ struct SignalFrameRt { impl Task { /// Legacy signal return syscall implementation for x86. pub(crate) fn sys_sigreturn(&self, ctx: &mut PtRegs) -> Result { - let lctx_addr = ctx.esp.wrapping_sub(8); + let sigframe_addr = ctx.esp.wrapping_sub(8); + let lctx_addr = sigframe_addr.wrapping_add(offset_of!(SignalFrame, context)); let lctx_ptr = ConstPtr::::from_usize(lctx_addr); let Some(lctx) = lctx_ptr.read_at_offset(0) else { self.force_signal(Signal::SIGSEGV, false); @@ -68,21 +69,21 @@ pub(super) fn sp(ctx: &PtRegs) -> usize { ctx.esp } -pub(super) fn get_signal_frame(sp: usize, action: &SigAction) -> usize { +pub(super) fn get_signal_frame(sp: usize, action: &SigAction) -> Option { let mut frame_addr = sp; // Space for the signal frame. if action.flags.contains(SaFlags::SIGINFO) { - frame_addr -= core::mem::size_of::(); + frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; } else { - frame_addr -= core::mem::size_of::(); + frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; } // Align the frame (offset by 4 bytes for return address). frame_addr &= !15; - frame_addr -= 4; + frame_addr = frame_addr.checked_sub(4)?; - frame_addr + Some(frame_addr) } impl SignalState { diff --git a/litebox_shim_linux/src/syscalls/signal/x86_64.rs b/litebox_shim_linux/src/syscalls/signal/x86_64.rs index 8455010aab..7d0f6228cf 100644 --- a/litebox_shim_linux/src/syscalls/signal/x86_64.rs +++ b/litebox_shim_linux/src/syscalls/signal/x86_64.rs @@ -28,20 +28,20 @@ pub(super) fn sp(ctx: &PtRegs) -> usize { ctx.rsp } -pub(super) fn get_signal_frame(sp: usize, _action: &SigAction) -> usize { +pub(super) fn get_signal_frame(sp: usize, _action: &SigAction) -> Option { let mut frame_addr = sp; // Skip the redzone. - frame_addr -= 128; + frame_addr = frame_addr.checked_sub(128)?; // Space for the signal frame. - frame_addr -= core::mem::size_of::(); + frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; // Align the frame (offset by 8 bytes for return address) frame_addr &= !15; - frame_addr -= 8; + frame_addr = frame_addr.checked_sub(8)?; - frame_addr + Some(frame_addr) } impl SignalState { From b4920d450efdcaf4ecef2a070116d63314714582 Mon Sep 17 00:00:00 2001 From: weitengchen Date: Wed, 18 Feb 2026 13:55:21 -0800 Subject: [PATCH 2/2] use wrapping_sub --- litebox_shim_linux/src/syscalls/signal/mod.rs | 2 +- litebox_shim_linux/src/syscalls/signal/x86.rs | 10 +++++----- litebox_shim_linux/src/syscalls/signal/x86_64.rs | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/litebox_shim_linux/src/syscalls/signal/mod.rs b/litebox_shim_linux/src/syscalls/signal/mod.rs index 5ba96786d2..9c21bb1c90 100644 --- a/litebox_shim_linux/src/syscalls/signal/mod.rs +++ b/litebox_shim_linux/src/syscalls/signal/mod.rs @@ -355,7 +355,7 @@ impl SignalState { sp }; - let frame_addr = arch::get_signal_frame(sp, action).ok_or(DeliverFault)?; + let frame_addr = arch::get_signal_frame(sp, action); if (switch_stacks || on_alt_stack) && !is_on_stack(&altstack, frame_addr) { return Err(DeliverFault); diff --git a/litebox_shim_linux/src/syscalls/signal/x86.rs b/litebox_shim_linux/src/syscalls/signal/x86.rs index 53e217cf26..4d5ec9d558 100644 --- a/litebox_shim_linux/src/syscalls/signal/x86.rs +++ b/litebox_shim_linux/src/syscalls/signal/x86.rs @@ -69,21 +69,21 @@ pub(super) fn sp(ctx: &PtRegs) -> usize { ctx.esp } -pub(super) fn get_signal_frame(sp: usize, action: &SigAction) -> Option { +pub(super) fn get_signal_frame(sp: usize, action: &SigAction) -> usize { let mut frame_addr = sp; // Space for the signal frame. if action.flags.contains(SaFlags::SIGINFO) { - frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; + frame_addr = frame_addr.wrapping_sub(core::mem::size_of::()); } else { - frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; + frame_addr = frame_addr.wrapping_sub(core::mem::size_of::()); } // Align the frame (offset by 4 bytes for return address). frame_addr &= !15; - frame_addr = frame_addr.checked_sub(4)?; + frame_addr = frame_addr.wrapping_sub(4); - Some(frame_addr) + frame_addr } impl SignalState { diff --git a/litebox_shim_linux/src/syscalls/signal/x86_64.rs b/litebox_shim_linux/src/syscalls/signal/x86_64.rs index 7d0f6228cf..f068df4232 100644 --- a/litebox_shim_linux/src/syscalls/signal/x86_64.rs +++ b/litebox_shim_linux/src/syscalls/signal/x86_64.rs @@ -28,20 +28,20 @@ pub(super) fn sp(ctx: &PtRegs) -> usize { ctx.rsp } -pub(super) fn get_signal_frame(sp: usize, _action: &SigAction) -> Option { +pub(super) fn get_signal_frame(sp: usize, _action: &SigAction) -> usize { let mut frame_addr = sp; // Skip the redzone. - frame_addr = frame_addr.checked_sub(128)?; + frame_addr = frame_addr.wrapping_sub(128); // Space for the signal frame. - frame_addr = frame_addr.checked_sub(core::mem::size_of::())?; + frame_addr = frame_addr.wrapping_sub(core::mem::size_of::()); // Align the frame (offset by 8 bytes for return address) frame_addr &= !15; - frame_addr = frame_addr.checked_sub(8)?; + frame_addr = frame_addr.wrapping_sub(8); - Some(frame_addr) + frame_addr } impl SignalState {