From aacb80853a46bd544fa76a945667302be1de706c Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Mon, 11 Jul 2016 22:50:18 +0000 Subject: Fixed a threading race condition where we could crash after calling Debugger::Terminate(). The issue was we have two global variables: one that contains a DebuggerList pointer and one that contains a std::mutex pointer. These get initialized in Debugger::Initialize(), and everywhere that uses these does: if (g_debugger_list_ptr && g_debugger_list_mutex_ptr) { std::lock_guard guard(*g_debugger_list_mutex_ptr); // do work while mutex is locked } Debugger::Terminate() was deleting and nulling out g_debugger_list_ptr which meant we had a race condition where someone might do the if statement and it evaluates to true, then another thread calls Debugger::Terminate() and deletes and nulls out g_debugger_list_ptr while holding the mutex, and another thread then locks the mutex and tries to use g_debugger_list_ptr. The fix is to just not delete and null out the g_debugger_list_ptr variable. llvm-svn: 275119 --- lldb/source/Core/Debugger.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'lldb/source/Core/Debugger.cpp') diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index dfff06d11a9..34608d0193f 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -462,8 +462,6 @@ Debugger::Terminate () for (const auto& debugger: *g_debugger_list_ptr) debugger->Clear(); g_debugger_list_ptr->clear(); - delete g_debugger_list_ptr; - g_debugger_list_ptr = nullptr; } } } -- cgit v1.2.3