From 287428271dd5329c9d84758c43fa350033818a3e Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Sat, 3 Aug 2019 20:31:41 -0400 Subject: [PATCH] kernel/condition_variable: Acquire and release locks in the right order. Should fix #15223. --- src/system/kernel/condition_variable.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/system/kernel/condition_variable.cpp b/src/system/kernel/condition_variable.cpp index 16ac6b809c..c33882e329 100644 --- a/src/system/kernel/condition_variable.cpp +++ b/src/system/kernel/condition_variable.cpp @@ -325,11 +325,12 @@ ConditionVariable::_NotifyLocked(bool all, status_t result) // entering Wait() and acquiring its own lock, and then acquiring ours. while (ConditionVariableEntry* entry = fEntries.RemoveHead()) { release_spinlock(&fLock); + acquire_spinlock(&entry->fLock); - SpinLocker _(entry->fLock); entry->fVariable = NULL; if (entry->fWaitStatus <= 0) { + release_spinlock(&entry->fLock); acquire_spinlock(&fLock); continue; } @@ -341,6 +342,7 @@ ConditionVariable::_NotifyLocked(bool all, status_t result) entry->fWaitStatus = result; + release_spinlock(&entry->fLock); acquire_spinlock(&fLock); if (!all)