Преглед изворни кода

Kernel: Fix PID/TID confusion in send_signal

This fixes the issue of a specific type of unkillable processes.
Ben Wiederhake пре 5 година
родитељ
комит
083671ef2c
1 измењених фајлова са 14 додато и 3 уклоњено
  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)
 {
     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 KResult(-ESRCH);