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;
         }
     }
 }


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to