From 853f7092f8b5ee6b17a5d4672cf9a6d1592c8e5b Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Sat, 26 Feb 2022 22:50:17 +0200 Subject: [PATCH] Kernel: Defer signal handling without a register capture earlier We were deferring the signal handling after already marking the signal as handling, which led to some failures in the Shell tests. --- Kernel/Thread.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Kernel/Thread.cpp b/Kernel/Thread.cpp index 93cf27c0a8d..ca7038f50de 100644 --- a/Kernel/Thread.cpp +++ b/Kernel/Thread.cpp @@ -979,6 +979,13 @@ DispatchSignalResult Thread::dispatch_signal(u8 signal) // FIXME: Implement SA_SIGINFO signal handlers. VERIFY(!(action.flags & SA_SIGINFO)); + if (!current_trap() && !action.handler_or_sigaction.is_null()) { + // We're trying dispatch a handled signal to a user process that was scheduled + // after a yielding/blocking kernel thread, we don't have a register capture of + // the thread, so just defer processing the signal to later. + return DispatchSignalResult::Deferred; + } + // Mark this signal as handled. m_pending_signals &= ~(1 << (signal - 1)); m_have_any_unmasked_pending_signals.store((m_pending_signals & ~m_signal_mask) != 0, AK::memory_order_release); @@ -1035,13 +1042,6 @@ DispatchSignalResult Thread::dispatch_signal(u8 signal) return DispatchSignalResult::Continue; } - if (!current_trap()) { - // We're trying dispatch a signal to a user process that was scheduled after - // a yielding/blocking kernel thread, we don't have a register capture of the - // thread, so just defer processing the signal to later. - return DispatchSignalResult::Deferred; - } - ScopedAddressSpaceSwitcher switcher(m_process); u32 old_signal_mask = m_signal_mask;