From 7481789eace972840e73ea7e323be104cd848534 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Sat, 24 Apr 2021 14:16:31 -0700 Subject: [PATCH] Kernel: Fix LOCK_DEBUG feature to work again - UBSAN detected cases where we were calling thread->holding_lock(..) but current_thread was nullptr. - Fix Lock::force_unlock_if_locked to not pass the correct ref delta to holding_lock(..). --- Kernel/Lock.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Kernel/Lock.cpp b/Kernel/Lock.cpp index c321a70db9..00f82ce9b6 100644 --- a/Kernel/Lock.cpp +++ b/Kernel/Lock.cpp @@ -53,7 +53,9 @@ void Lock::lock(Mode mode) VERIFY(m_times_locked == 0); m_times_locked++; #if LOCK_DEBUG - current_thread->holding_lock(*this, 1, file, line); + if (current_thread) { + current_thread->holding_lock(*this, 1, file, line); + } #endif m_queue.should_block(true); m_lock.store(false, AK::memory_order_release); @@ -165,7 +167,9 @@ void Lock::unlock() } #if LOCK_DEBUG - current_thread->holding_lock(*this, -1); + if (current_thread) { + current_thread->holding_lock(*this, -1); + } #endif m_lock.store(false, AK::memory_order_release); @@ -201,7 +205,7 @@ auto Lock::force_unlock_if_locked(u32& lock_count_to_restore) -> Mode dbgln_if(LOCK_RESTORE_DEBUG, "Lock::force_unlock_if_locked @ {}: unlocking exclusive with lock count: {}", this, m_times_locked); #if LOCK_DEBUG - m_holder->holding_lock(*this, -(int)lock_count_to_restore); + m_holder->holding_lock(*this, -(int)m_times_locked); #endif m_holder = nullptr; VERIFY(m_times_locked > 0);