From 8456dc87d8e0c3fadc445cf5c89aef5ea359997d Mon Sep 17 00:00:00 2001 From: cbsirb Date: Thu, 25 Feb 2021 17:19:31 +0200 Subject: [PATCH] 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) --- Kernel/Process.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 1ae5a9ea9f..ec26de63af 100644 --- a/Kernel/Process.cpp +++ b/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(); }