Sfoglia il codice sorgente

Merge pull request #8559 from liamwhite/waiter-list

kernel: fix usage of waiter_list in Finalize
bunnei 4 anni fa
parent
commit
802bbb2263
1 ha cambiato i file con 9 aggiunte e 3 eliminazioni
  1. 9 3
      src/core/hle/kernel/k_thread.cpp

+ 9 - 3
src/core/hle/kernel/k_thread.cpp

@@ -308,14 +308,20 @@ void KThread::Finalize() {
 
 
         auto it = waiter_list.begin();
         auto it = waiter_list.begin();
         while (it != waiter_list.end()) {
         while (it != waiter_list.end()) {
-            // Clear the lock owner
-            it->SetLockOwner(nullptr);
+            // Get the thread.
+            KThread* const waiter = std::addressof(*it);
+
+            // The thread shouldn't be a kernel waiter.
+            ASSERT(!IsKernelAddressKey(waiter->GetAddressKey()));
+
+            // Clear the lock owner.
+            waiter->SetLockOwner(nullptr);
 
 
             // Erase the waiter from our list.
             // Erase the waiter from our list.
             it = waiter_list.erase(it);
             it = waiter_list.erase(it);
 
 
             // Cancel the thread's wait.
             // Cancel the thread's wait.
-            it->CancelWait(ResultInvalidState, true);
+            waiter->CancelWait(ResultInvalidState, true);
         }
         }
     }
     }