Pārlūkot izejas kodu

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.
Idan Horowitz 3 gadi atpakaļ
vecāks
revīzija
853f7092f8
1 mainītis faili ar 7 papildinājumiem un 7 dzēšanām
  1. 7 7
      Kernel/Thread.cpp

+ 7 - 7
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;