From aa129120b12c4ffd907b8765b30044691696a1b2 Mon Sep 17 00:00:00 2001 From: Christian Ullrich Date: Tue, 26 Apr 2016 18:46:17 +0200 Subject: [PATCH 3/3] Pin any DLL as soon as we see it, to avoid the unload race. --- src/port/win32env.c | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/src/port/win32env.c b/src/port/win32env.c index 9afc31f..57a9c7d 100644 --- a/src/port/win32env.c +++ b/src/port/win32env.c @@ -43,27 +43,28 @@ pgwin32_putenv(const char *envval) char *modulename; HMODULE hmodule; PUTENVPROC putenvFunc; + bool pinned; } rtmodules[] = { - { "msvcrt", NULL, NULL }, - { "msvcrtd", NULL, NULL }, /* Visual Studio 6.0 / mingw */ - { "msvcr70", NULL, NULL }, - { "msvcr70d", NULL, NULL }, /* Visual Studio 2002 */ - { "msvcr71", NULL, NULL }, - { "msvcr71d", NULL, NULL }, /* Visual Studio 2003 */ - { "msvcr80", NULL, NULL }, - { "msvcr80d", NULL, NULL }, /* Visual Studio 2005 */ - { "msvcr90", NULL, NULL }, - { "msvcr90d", NULL, NULL }, /* Visual Studio 2008 */ - { "msvcr100", NULL, NULL }, - { "msvcr100d", NULL, NULL }, /* Visual Studio 2010 */ - { "msvcr110", NULL, NULL }, - { "msvcr110d", NULL, NULL }, /* Visual Studio 2012 */ - { "msvcr120", NULL, NULL }, - { "msvcr120d", NULL, NULL }, /* Visual Studio 2013 */ - { "ucrtbase", NULL, NULL }, - { "ucrtbased", NULL, NULL }, /* Visual Studio 2015+ */ - { NULL, 0, NULL } + { "msvcrt", NULL, NULL, false }, + { "msvcrtd", NULL, NULL, false }, /* Visual Studio 6.0 / mingw */ + { "msvcr70", NULL, NULL, false }, + { "msvcr70d", NULL, NULL, false }, /* Visual Studio 2002 */ + { "msvcr71", NULL, NULL, false }, + { "msvcr71d", NULL, NULL, false }, /* Visual Studio 2003 */ + { "msvcr80", NULL, NULL, false }, + { "msvcr80d", NULL, NULL, false }, /* Visual Studio 2005 */ + { "msvcr90", NULL, NULL, false }, + { "msvcr90d", NULL, NULL, false }, /* Visual Studio 2008 */ + { "msvcr100", NULL, NULL, false }, + { "msvcr100d", NULL, NULL, false }, /* Visual Studio 2010 */ + { "msvcr110", NULL, NULL, false }, + { "msvcr110d", NULL, NULL, false }, /* Visual Studio 2012 */ + { "msvcr120", NULL, NULL, false }, + { "msvcr120d", NULL, NULL, false }, /* Visual Studio 2013 */ + { "ucrtbase", NULL, NULL, false }, + { "ucrtbased", NULL, NULL, false }, /* Visual Studio 2015+ */ + { NULL, 0, NULL, false } }; int i; @@ -81,6 +82,16 @@ pgwin32_putenv(const char *envval) } else { + if (!rtmodules[i].pinned) + { + HMODULE tmp; + BOOL res = GetModuleHandleEx( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_PIN, + (LPCTSTR)rtmodules[i].hmodule, + &tmp); + rtmodules[i].pinned = !!res; + } rtmodules[i].putenvFunc = (PUTENVPROC) GetProcAddress(rtmodules[i].hmodule, "_putenv"); if (rtmodules[i].putenvFunc == NULL) { -- 2.8.1.windows.1