From b79cf4743b945685ace6bb5797900839e09b1c87 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Mon, 26 May 2025 15:34:48 +0200 Subject: [PATCH] globals: Fix memory leak on Windows DLL unload Thread-local memory must be freed for the main thread as well after 4f08a1a2. Fixes #925. --- globals.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/globals.c b/globals.c index 251a7e90e..2b71a508a 100644 --- a/globals.c +++ b/globals.c @@ -791,34 +791,34 @@ DllMain(ATTRIBUTE_UNUSED HINSTANCE hinstDLL, DWORD fdwReason, ATTRIBUTE_UNUSED LPVOID lpvReserved) #endif { - switch (fdwReason) { - case DLL_THREAD_DETACH: + if ((fdwReason == DLL_THREAD_DETACH) || + (fdwReason == DLL_PROCESS_DETACH)) { #ifdef USE_TLS - xmlFreeGlobalState(&globalState); + xmlFreeGlobalState(&globalState); #else - if (globalkey != TLS_OUT_OF_INDEXES) { - xmlGlobalState *globalval; + if (globalkey != TLS_OUT_OF_INDEXES) { + xmlGlobalState *globalval; - globalval = (xmlGlobalState *) TlsGetValue(globalkey); - if (globalval) { - xmlFreeGlobalState(globalval); - TlsSetValue(globalkey, NULL); - } + globalval = (xmlGlobalState *) TlsGetValue(globalkey); + if (globalval) { + xmlFreeGlobalState(globalval); + TlsSetValue(globalkey, NULL); } -#endif - break; - -#ifndef LIBXML_THREAD_ALLOC_ENABLED - case DLL_PROCESS_DETACH: - if (xmlFree == free) - xmlCleanupParser(); - if (globalkey != TLS_OUT_OF_INDEXES) { - TlsFree(globalkey); - globalkey = TLS_OUT_OF_INDEXES; - } - break; + } #endif } + +#ifndef LIBXML_THREAD_ALLOC_ENABLED + if (fdwReason == DLL_PROCESS_DETACH) { + if (xmlFree == free) + xmlCleanupParser(); + if (globalkey != TLS_OUT_OF_INDEXES) { + TlsFree(globalkey); + globalkey = TLS_OUT_OF_INDEXES; + } + } +#endif + return TRUE; } #endif /* USE_DLL_MAIN */