Daniel Lehman : msvcrt: Protect onexit table with critical section.
Alexandre Julliard
julliard at winehq.org
Tue Sep 12 15:40:38 CDT 2017
Module: wine
Branch: master
Commit: 67012e8300d7520ed34ee433dbed48ddfdf25e03
URL: http://source.winehq.org/git/wine.git/?a=commit;h=67012e8300d7520ed34ee433dbed48ddfdf25e03
Author: Daniel Lehman <dlehman at esri.com>
Date: Thu Aug 31 14:59:12 2017 -0700
msvcrt: Protect onexit table with critical section.
Signed-off-by: Daniel Lehman <dlehman at esri.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/exit.c | 30 ++++++++++++++++++++++++++----
1 file changed, 26 insertions(+), 4 deletions(-)
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c
index 9fd373e..4eff073 100644
--- a/dlls/msvcrt/exit.c
+++ b/dlls/msvcrt/exit.c
@@ -41,6 +41,15 @@ typedef struct MSVCRT__onexit_table_t
MSVCRT__onexit_t *_end;
} MSVCRT__onexit_table_t;
+static CRITICAL_SECTION MSVCRT_onexit_cs;
+static CRITICAL_SECTION_DEBUG MSVCRT_onexit_cs_debug =
+{
+ 0, 0, &MSVCRT_onexit_cs,
+ { &MSVCRT_onexit_cs_debug.ProcessLocksList, &MSVCRT_onexit_cs_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": MSVCRT_onexit_cs") }
+};
+static CRITICAL_SECTION MSVCRT_onexit_cs = { &MSVCRT_onexit_cs_debug, -1, 0, 0, 0, 0 };
+
extern int MSVCRT_app_type;
extern MSVCRT_wchar_t *MSVCRT__wpgmptr;
@@ -368,12 +377,14 @@ int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT
if (!table)
return -1;
+ EnterCriticalSection(&MSVCRT_onexit_cs);
if (!table->_first)
{
table->_first = MSVCRT_calloc(32, sizeof(void *));
if (!table->_first)
{
WARN("failed to allocate initial table.\n");
+ LeaveCriticalSection(&MSVCRT_onexit_cs);
return -1;
}
table->_last = table->_first;
@@ -388,6 +399,7 @@ int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT
if (!tmp)
{
WARN("failed to grow table.\n");
+ LeaveCriticalSection(&MSVCRT_onexit_cs);
return -1;
}
table->_first = tmp;
@@ -397,6 +409,7 @@ int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT
*table->_last = func;
table->_last++;
+ LeaveCriticalSection(&MSVCRT_onexit_cs);
return 0;
}
@@ -406,24 +419,33 @@ int CDECL MSVCRT__register_onexit_function(MSVCRT__onexit_table_t *table, MSVCRT
int CDECL MSVCRT__execute_onexit_table(MSVCRT__onexit_table_t *table)
{
MSVCRT__onexit_t *func;
+ MSVCRT__onexit_table_t copy;
TRACE("(%p)\n", table);
if (!table)
return -1;
+ EnterCriticalSection(&MSVCRT_onexit_cs);
if (!table->_first || table->_first >= table->_last)
+ {
+ LeaveCriticalSection(&MSVCRT_onexit_cs);
return 0;
+ }
+ copy._first = table->_first;
+ copy._last = table->_last;
+ copy._end = table->_end;
+ memset(table, 0, sizeof(*table));
+ MSVCRT__initialize_onexit_table(table);
+ LeaveCriticalSection(&MSVCRT_onexit_cs);
- for (func = table->_last - 1; func >= table->_first; func--)
+ for (func = copy._last - 1; func >= copy._first; func--)
{
if (*func)
(*func)();
}
- MSVCRT_free(table->_first);
- memset(table, 0, sizeof(*table));
- MSVCRT__initialize_onexit_table(table);
+ MSVCRT_free(copy._first);
return 0;
}
More information about the wine-cvs
mailing list