Pārlūkot izejas kodu

Kernel: Fix PID/TID confusion in send_signal

This fixes the issue of a specific type of unkillable processes.
Ben Wiederhake 5 gadi atpakaļ
vecāks
revīzija
083671ef2c
1 mainītis faili ar 14 papildinājumiem un 3 dzēšanām
  1. 14 3
      Kernel/Process.cpp

+ 14 - 3
Kernel/Process.cpp

@@ -790,9 +790,20 @@ void Process::terminate_due_to_signal(u8 signal)
 KResult Process::send_signal(u8 signal, Process* sender)
 KResult Process::send_signal(u8 signal, Process* sender)
 {
 {
     InterruptDisabler disabler;
     InterruptDisabler disabler;
-    // FIXME: PID/TID BUG
-    if (auto* thread = Thread::from_tid(m_pid.value())) {
-        thread->send_signal(signal, sender);
+    Thread* receiver_thread;
+    // Try to send it to the "obvious" main thread:
+    receiver_thread = Thread::from_tid(m_pid.value());
+    // If the main thread has died, there may still be other threads:
+    if (!receiver_thread) {
+        // The first one should be good enough.
+        // Neither kill(2) nor kill(3) specify any selection precedure.
+        for_each_thread([&receiver_thread](Thread& thread) -> IterationDecision {
+            receiver_thread = &thread;
+            return IterationDecision::Break;
+        });
+    }
+    if (receiver_thread) {
+        receiver_thread->send_signal(signal, sender);
         return KSuccess;
         return KSuccess;
     }
     }
     return KResult(-ESRCH);
     return KResult(-ESRCH);