From bba7b21419ea5a0c521442c605b5e7701c713548 Mon Sep 17 00:00:00 2001 From: Tom Ritter Date: Fri, 8 Jun 2018 13:12:11 -0500 Subject: [PATCH] Bug 1389967 In MinGW, work around a pointer to a function thunk disappearing when we unload nssckbi r?franziskus,dmajor --- security/nss/lib/base/error.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/security/nss/lib/base/error.c b/security/nss/lib/base/error.c index 95a76cf79968a..2596a5c093218 100644 --- a/security/nss/lib/base/error.c +++ b/security/nss/lib/base/error.c @@ -15,6 +15,10 @@ #include /* for UINT_MAX */ #include /* for memmove */ +#if defined(__MINGW32__) +#include +#endif + #define NSS_MAX_ERROR_STACK_COUNT 16 /* error codes */ /* @@ -65,7 +69,26 @@ static const PRCallOnceType error_call_again; static PRStatus error_once_function(void) { + +/* + * This #ifdef function is redundant. It performs the same thing as the + * else case. + * + * However, the MinGW version looks up the function from nss3's export + * table, and on MinGW _that_ behaves differently than passing a + * function pointer in a different module because MinGW has + * -mnop-fun-dllimport specified, which generates function thunks for + * cross-module calls. And when a module (like nssckbi) gets unloaded, + * and you try to call into that thunk (which is now missing) you'll + * crash. So we do this bit of ugly to avoid that crash. Fortunately + * this is the only place we've had to do this. + */ +#if defined(__MINGW32__) + HMODULE nss3 = GetModuleHandleW(L"nss3"); + return PR_NewThreadPrivateIndex(&error_stack_index, GetProcAddress(nss3, "PR_Free")); +#else return PR_NewThreadPrivateIndex(&error_stack_index, PR_Free); +#endif } /* -- GitLab