Module: wine Branch: master Commit: f970db947a1cb1aedcec4e7adb946428c7fb6e96 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f970db947a1cb1aedcec4e7adb...
Author: Rob Shearman robertshearman@gmail.com Date: Tue Feb 24 14:50:55 2009 +0000
imm32: Fix crash in DllMain when FreeLibrary is called from a thread which existed before the DLL was loaded.
The code in IMM_FreeThreadData shouldn't assume that thread data will always have been created, so check for NULL data.
Make loading the DLL more robust against errors.
---
dlls/imm32/imm.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index bb50e5e..82868be 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -223,22 +223,28 @@ static IMMThreadData* IMM_GetThreadData(void) return TlsGetValue(tlsIndex); }
-static void IMM_InitThreadData(void) +static BOOL IMM_InitThreadData(void) { IMMThreadData* data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMMThreadData)); + if (!data) return FALSE; + TlsSetValue(tlsIndex,data);
TRACE("Thread Data Created\n"); + return TRUE; }
static void IMM_FreeThreadData(void) { IMMThreadData* data = TlsGetValue(tlsIndex); - IMM_DestroyContext(data->defaultContext); - DestroyWindow(data->hwndDefault); - HeapFree(GetProcessHeap(),0,data); - TRACE("Thread Data Destroyed\n"); + if (data) + { + IMM_DestroyContext(data->defaultContext); + DestroyWindow(data->hwndDefault); + HeapFree(GetProcessHeap(),0,data); + TRACE("Thread Data Destroyed\n"); + } }
static HMODULE LoadDefaultWineIME(void) @@ -378,7 +384,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved) case DLL_PROCESS_ATTACH: IMM_RegisterMessages(); tlsIndex = TlsAlloc(); - IMM_InitThreadData(); + if (tlsIndex == TLS_OUT_OF_INDEXES || !IMM_InitThreadData()) + return FALSE; break; case DLL_THREAD_ATTACH: IMM_InitThreadData();