From 98408b8920e703979f8f0feb5fdc9e67a6de729e Mon Sep 17 00:00:00 2001 From: sin-ack Date: Sun, 15 Aug 2021 08:25:29 +0000 Subject: [PATCH] Kernel: Don't hold the process list lock while destructing the process Once we remove the process from the process list, we're free to do whatever we want without any locks. --- Kernel/Process.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index 6c225ab345..9b1a05b078 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -302,16 +302,19 @@ bool Process::unref() const // NOTE: We need to obtain the process list lock before doing anything, // because otherwise someone might get in between us lowering the // refcount and acquiring the lock. - return processes().with_exclusive([&](auto& list) { + auto did_hit_zero = processes().with_exclusive([&](auto& list) { auto new_ref_count = deref_base(); if (new_ref_count > 0) return false; if (m_list_node.is_in_list()) list.remove(*const_cast(this)); - delete this; return true; }); + + if (did_hit_zero) + delete this; + return did_hit_zero; } // Make sure the compiler doesn't "optimize away" this function: