[Lldb-commits] [lldb] r275119 - Fixed a threading race condition where we could crash after calling Debugger::Terminate().
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Mon Jul 11 15:50:18 PDT 2016
Author: gclayton
Date: Mon Jul 11 17:50:18 2016
New Revision: 275119
URL: http://llvm.org/viewvc/llvm-project?rev=275119&view=rev
Log:
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<std::recursive_mutex> 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.
Modified:
lldb/trunk/source/Core/Debugger.cpp
Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=275119&r1=275118&r2=275119&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Mon Jul 11 17:50:18 2016
@@ -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;
}
}
}
More information about the lldb-commits
mailing list