diff options
author | Vlad Brezae <brezaevlad@gmail.com> | 2018-10-01 17:29:23 +0300 |
---|---|---|
committer | monojenkins <jo.shields+jenkins@xamarin.com> | 2018-10-01 23:30:02 +0300 |
commit | 6c46acfe697aae35bcc09c25a68bc7b67dad73d8 (patch) | |
tree | 804236d1911a630f6cc4318243774f1b3731fdbc | |
parent | 46e0249d4cdf8ed3e1f1ad2f62e27a75309f41b5 (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.c | 30 |
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 |