Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Brezae <brezaevlad@gmail.com>2018-10-01 17:29:23 +0300
committermonojenkins <jo.shields+jenkins@xamarin.com>2018-10-01 23:30:02 +0300
commit6c46acfe697aae35bcc09c25a68bc7b67dad73d8 (patch)
tree804236d1911a630f6cc4318243774f1b3731fdbc
parent46e0249d4cdf8ed3e1f1ad2f62e27a75309f41b5 (diff)
[runtime] Disable stack guard for main thread on osx
On macOS Mojave, it seems that changing the mapping of stack pages for main thread can lead to corruption bugs. https://github.com/mono/mono/issues/10802
-rw-r--r--mono/mini/mini-exceptions.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c
index d36a0af37b6..9316af36f85 100644
--- a/mono/mini/mini-exceptions.c
+++ b/mono/mini/mini-exceptions.c
@@ -2703,6 +2703,15 @@ mono_setup_altstack (MonoJitTlsData *tls)
size_t stsize = 0;
stack_t sa;
guint8 *staddr = NULL;
+#ifdef TARGET_OSX
+ /*
+ * On macOS Mojave we are encountering a bug when changing mapping for main thread
+ * stack pages. Stack overflow on main thread will kill the app.
+ */
+ gboolean disable_stack_guard = pthread_main_np ();
+#else
+ gboolean disable_stack_guard = FALSE;
+#endif
if (mono_running_on_valgrind ())
return;
@@ -2716,16 +2725,18 @@ mono_setup_altstack (MonoJitTlsData *tls)
/*g_print ("thread %p, stack_base: %p, stack_size: %d\n", (gpointer)pthread_self (), staddr, stsize);*/
- tls->stack_ovf_guard_base = staddr + mono_pagesize ();
- tls->stack_ovf_guard_size = ALIGN_TO (8 * 4096, mono_pagesize ());
+ if (!disable_stack_guard) {
+ tls->stack_ovf_guard_base = staddr + mono_pagesize ();
+ tls->stack_ovf_guard_size = ALIGN_TO (8 * 4096, mono_pagesize ());
- g_assert ((guint8*)&sa >= (guint8*)tls->stack_ovf_guard_base + tls->stack_ovf_guard_size);
+ g_assert ((guint8*)&sa >= (guint8*)tls->stack_ovf_guard_base + tls->stack_ovf_guard_size);
- if (mono_mprotect (tls->stack_ovf_guard_base, tls->stack_ovf_guard_size, MONO_MMAP_NONE)) {
- /* mprotect can fail for the main thread stack */
- gpointer gaddr = mono_valloc (tls->stack_ovf_guard_base, tls->stack_ovf_guard_size, MONO_MMAP_NONE|MONO_MMAP_PRIVATE|MONO_MMAP_ANON|MONO_MMAP_FIXED, MONO_MEM_ACCOUNT_EXCEPTIONS);
- g_assert (gaddr == tls->stack_ovf_guard_base);
- tls->stack_ovf_valloced = TRUE;
+ if (mono_mprotect (tls->stack_ovf_guard_base, tls->stack_ovf_guard_size, MONO_MMAP_NONE)) {
+ /* mprotect can fail for the main thread stack */
+ gpointer gaddr = mono_valloc (tls->stack_ovf_guard_base, tls->stack_ovf_guard_size, MONO_MMAP_NONE|MONO_MMAP_PRIVATE|MONO_MMAP_ANON|MONO_MMAP_FIXED, MONO_MEM_ACCOUNT_EXCEPTIONS);
+ g_assert (gaddr == tls->stack_ovf_guard_base);
+ tls->stack_ovf_valloced = TRUE;
+ }
}
/* Setup an alternate signal stack */
@@ -2756,6 +2767,9 @@ mono_free_altstack (MonoJitTlsData *tls)
if (tls->signal_stack)
mono_vfree (tls->signal_stack, MONO_ARCH_SIGNAL_STACK_SIZE, MONO_MEM_ACCOUNT_EXCEPTIONS);
+
+ if (!tls->stack_ovf_guard_base)
+ return;
if (tls->stack_ovf_valloced)
mono_vfree (tls->stack_ovf_guard_base, tls->stack_ovf_guard_size, MONO_MEM_ACCOUNT_EXCEPTIONS);
else