From dcc7a89be1bee430f05fe0c06bc448d2c7aaaf51 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Tue, 10 Jun 2014 16:55:24 +0100 Subject: [PATCH] Changed mono_win_chained_exception_needs_run to be a JIT TLS variable. This fixes a potential race condition that might happen if two threads try to handle an exception at the same time. --- mono/mini/exceptions-amd64.c | 6 +++--- mono/mini/exceptions-x86.c | 6 +++--- mono/mini/mini-windows.c | 5 ++--- mono/mini/mini.h | 5 +++++ 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c index bd9847c4172..a27176d295a 100644 --- a/mono/mini/exceptions-amd64.c +++ b/mono/mini/exceptions-amd64.c @@ -48,7 +48,6 @@ static MonoW32ExceptionHandler segv_handler; LPTOP_LEVEL_EXCEPTION_FILTER mono_old_win_toplevel_exception_filter; void *mono_win_vectored_exception_handle; -extern gboolean mono_win_chained_exception_needs_run; #define W32_SEH_HANDLE_EX(_ex) \ if (_ex##_handler) _ex##_handler(0, ep, sctx) @@ -76,8 +75,9 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) CONTEXT* ctx; MonoContext* sctx; LONG res; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); - mono_win_chained_exception_needs_run = FALSE; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; er = ep->ExceptionRecord; @@ -118,7 +118,7 @@ static LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) break; } - if (mono_win_chained_exception_needs_run) { + if (jit_tls->mono_win_chained_exception_needs_run) { /* Don't copy context back if we chained exception * as the handler may have modfied the EXCEPTION_POINTERS * directly. We don't pass sigcontext to chained handlers. diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index 86a28e08ab4..0505633d1bc 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -47,7 +47,6 @@ static MonoW32ExceptionHandler segv_handler; LPTOP_LEVEL_EXCEPTION_FILTER mono_old_win_toplevel_exception_filter; gpointer mono_win_vectored_exception_handle; -extern gboolean mono_win_chained_exception_needs_run; extern int (*gUnhandledExceptionHandler)(EXCEPTION_POINTERS*); #ifndef PROCESS_CALLBACK_FILTER_ENABLED @@ -196,8 +195,9 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) CONTEXT* ctx; struct sigcontext* sctx; LONG res; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); - mono_win_chained_exception_needs_run = FALSE; + jit_tls->mono_win_chained_exception_needs_run = FALSE; res = EXCEPTION_CONTINUE_EXECUTION; er = ep->ExceptionRecord; @@ -237,7 +237,7 @@ LONG CALLBACK seh_vectored_exception_handler(EXCEPTION_POINTERS* ep) break; } - if (mono_win_chained_exception_needs_run) { + if (jit_tls->mono_win_chained_exception_needs_run) { /* Don't copy context back if we chained exception * as the handler may have modfied the EXCEPTION_POINTERS * directly. We don't pass sigcontext to chained handlers. diff --git a/mono/mini/mini-windows.c b/mono/mini/mini-windows.c index bb71ec48192..c43b1d0102f 100644 --- a/mono/mini/mini-windows.c +++ b/mono/mini/mini-windows.c @@ -50,8 +50,6 @@ #include "jit-icalls.h" -gboolean mono_win_chained_exception_needs_run; - void mono_runtime_install_handlers (void) { @@ -83,7 +81,8 @@ mono_runtime_cleanup_handlers (void) gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) { - mono_win_chained_exception_needs_run = TRUE; + MonoJitTlsData *jit_tls = mono_native_tls_get_value (mono_jit_tls_id); + jit_tls->mono_win_chained_exception_needs_run = TRUE; return TRUE; } diff --git a/mono/mini/mini.h b/mono/mini/mini.h index ff3d5537ad2..76cbdf32022 100644 --- a/mono/mini/mini.h +++ b/mono/mini/mini.h @@ -1060,6 +1060,11 @@ typedef struct { */ MonoContext orig_ex_ctx; gboolean orig_ex_ctx_set; + + /* + * Stores if we need to run a chained exception in Windows. + */ + gboolean mono_win_chained_exception_needs_run; } MonoJitTlsData; /* -- 2.25.1