Browse Source

Kernel: Detach the traced process on process exit

Currently, when a process which has a tracee exits, nothing will happen,
leaving the tracee unable to be attached again. This will call the
stop_tracing function on any process which is traced by the exiting
process and sending the SIGSTOP signal making the traced process wait
for a SIGCONT (just as Linux does)
cbsirb 4 năm trước cách đây
mục cha
commit
8456dc87d8
1 tập tin đã thay đổi với 16 bổ sung0 xóa
  1. 16 0
      Kernel/Process.cpp

+ 16 - 0
Kernel/Process.cpp

@@ -543,6 +543,22 @@ void Process::die()
         return IterationDecision::Continue;
     });
 
+    {
+        ScopedSpinLock lock(g_processes_lock);
+        for (auto* process = g_processes->head(); process;) {
+            auto* next_process = process->next();
+            if (process->has_tracee_thread(m_pid)) {
+                dbgln_if(PROCESS_DEBUG, "Process {} ({}) is attached by {} ({}) which will exit", process->name(), process->pid(), name(), pid());
+                process->stop_tracing();
+                auto err = process->send_signal(SIGSTOP, this);
+                if (err.is_error())
+                    dbgln("Failed to send the SIGSTOP signal to {} ({})", process->name(), process->pid());
+            }
+
+            process = next_process;
+        }
+    }
+
     kill_all_threads();
 }