[tbb-commits] [tor-browser/tor-browser-60.0.1esr-8.0-1] Bug 1389967 In MinGW, work around a pointer to a function thunk disappearing when we unload nssckbi r?franziskus, dmajor
gk at torproject.org
gk at torproject.org
Thu Jun 14 12:19:10 UTC 2018
commit cb8da44a0ae2de7ec5bd8bf5e66579f46e6902cc
Author: Tom Ritter <tom at mozilla.com>
Date: Fri Jun 8 13:12:11 2018 -0500
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 95a76cf79968..2596a5c09321 100644
--- a/security/nss/lib/base/error.c
+++ b/security/nss/lib/base/error.c
@@ -15,6 +15,10 @@
#include <limits.h> /* for UINT_MAX */
#include <string.h> /* for memmove */
+#if defined(__MINGW32__)
+#include <windows.h>
+#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
}
/*
More information about the tbb-commits
mailing list