From 18af8be0e6c02786ce0dd58582e505f4ed47540f Mon Sep 17 00:00:00 2001 From: Sergey Lisov Date: Mon, 21 Nov 2022 00:36:24 +0300 Subject: [PATCH] Kernel: Set EFLAGS/RFLAGS to a known-good value on signal entry --- Kernel/Thread.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 6fbfab58d5..b98dd200c9 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -1234,6 +1234,15 @@ DispatchSignalResult Thread::dispatch_signal(u8 signal) auto signal_trampoline_addr = process.signal_trampoline().get(); regs.set_ip(signal_trampoline_addr); + // Userspace flags might be invalid for function entry, according to SYSV ABI (section 3.2.1). + // Set them to a known-good value to avoid weird handler misbehavior. + // Only IF (and the reserved bit 1) are set. +#if ARCH(I386) + regs.set_flags(2 | (regs.eflags & ~safe_eflags_mask)); +#elif ARCH(X86_64) + regs.set_flags(2 | (regs.rflags & ~safe_eflags_mask)); +#endif + dbgln_if(SIGNAL_DEBUG, "Thread in state '{}' has been primed with signal handler {:#04x}:{:p} to deliver {}", state_string(), m_regs.cs, m_regs.ip(), signal); return DispatchSignalResult::Continue;