Kernel: Fix PID/TID confusion in send_signal
This fixes the issue of a specific type of unkillable processes.
This commit is contained in:
parent
bee08a4b9f
commit
083671ef2c
Notes:
sideshowbarker
2024-07-19 04:06:35 +09:00
Author: https://github.com/BenWiederhake Commit: https://github.com/SerenityOS/serenity/commit/083671ef2cc Pull-request: https://github.com/SerenityOS/serenity/pull/3057 Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/awesomekling Reviewed-by: https://github.com/bgianfo
1 changed files with 14 additions and 3 deletions
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue