From 3d7b030d3a9a69bb73ed6d9cba72768be623df26 Mon Sep 17 00:00:00 2001 From: rglarix Date: Thu, 2 Feb 2017 15:27:06 +0100 Subject: [PATCH] fix: blockinfo can be changed after being extracted, must be locked externally --- src/vld.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/vld.cpp b/src/vld.cpp index d19295ff..83aed2ad 100644 --- a/src/vld.cpp +++ b/src/vld.cpp @@ -350,6 +350,7 @@ VisualLeakDetector::VisualLeakDetector () m_reportFile = NULL; wcsncpy_s(m_reportFilePath, MAX_PATH, VLD_DEFAULT_REPORT_FILE_NAME, _TRUNCATE); m_status = 0x0; + m_optionsLock.Initialize(); HMODULE ntdll = GetModuleHandleW(L"ntdll.dll"); if (ntdll) @@ -420,7 +421,6 @@ VisualLeakDetector::VisualLeakDetector () m_curAlloc = 0; m_maxAlloc = 0; m_loadedModules = new ModuleSet(); - m_optionsLock.Initialize(); m_modulesLock.Initialize(); m_selfTestFile = __FILE__; m_selfTestLine = 0; @@ -1346,8 +1346,6 @@ tls_t* VisualLeakDetector::getTls () // VOID VisualLeakDetector::mapBlock (HANDLE heap, LPCVOID mem, SIZE_T size, bool debugcrtalloc, bool ucrt, DWORD threadId, blockinfo_t* &pblockInfo) { - CriticalSectionLocker<> cs(g_heapMapLock); - // Record the block's information. blockinfo_t* blockinfo = new blockinfo_t(); blockinfo->callStack = NULL; @@ -1562,8 +1560,6 @@ VOID VisualLeakDetector::unmapHeap (HANDLE heap) VOID VisualLeakDetector::remapBlock (HANDLE heap, LPCVOID mem, LPCVOID newmem, SIZE_T size, bool debugcrtalloc, bool ucrt, DWORD threadId, blockinfo_t* &pblockInfo, const context_t &context) { - CriticalSectionLocker<> cs(g_heapMapLock); - if (newmem != mem) { // The block was not reallocated in-place. Instead the old block was // freed and a new block allocated to satisfy the new size. @@ -2925,6 +2921,11 @@ CaptureContext::~CaptureContext() { return; if ((m_tls->blockWithoutGuard) && (!IsExcludedModule())) { + CallStack* callstack = CallStack::Create(); + callstack->getStackTrace(g_vld.m_maxTraceFrames, m_tls->context); + + CriticalSectionLocker<> cs(g_heapMapLock); + blockinfo_t* pblockInfo = NULL; if (m_tls->newBlockWithoutGuard == NULL) { g_vld.mapBlock(m_tls->heap, @@ -2946,8 +2947,6 @@ CaptureContext::~CaptureContext() { pblockInfo, m_tls->context); } - CallStack* callstack = CallStack::Create(); - callstack->getStackTrace(g_vld.m_maxTraceFrames, m_tls->context); pblockInfo->callStack.reset(callstack); }