[merp] Revert 7a0425e which is causing xamarin-android failures (#41709)
authormonojenkins <jo.shields+jenkins@xamarin.com>
Fri, 4 Sep 2020 21:03:56 +0000 (17:03 -0400)
committerGitHub <noreply@github.com>
Fri, 4 Sep 2020 21:03:56 +0000 (23:03 +0200)
This commit https://github.com/mono/mono/commit/7a0425e81ffe0e77a4ba22ff45e691934ecc49a1 is causing the following xamarin-android issue: https://github.com/mono/mono/issues/20275

This pull request reverts it.

Co-authored-by: naricc <naricc@users.noreply.github.com>
src/mono/mono/mini/exceptions-amd64.c
src/mono/mono/mini/exceptions-ppc.c
src/mono/mono/mini/exceptions-x86.c
src/mono/mono/mini/mini-exceptions.c
src/mono/mono/mini/mini-posix.c
src/mono/mono/mini/mini-runtime.c
src/mono/mono/mini/mini-runtime.h
src/mono/mono/mini/mini-windows.c
src/mono/mono/mini/mini.h

index 8be488d..e23329d 100644 (file)
@@ -66,7 +66,7 @@ static LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep)
 #endif
 
        if (mono_dump_start ())
-               mono_handle_native_crash (mono_get_signame (SIGSEGV), NULL, NULL, NULL);
+               mono_handle_native_crash (mono_get_signame (SIGSEGV), NULL, NULL);
 
        return EXCEPTION_CONTINUE_SEARCH;
 }
@@ -876,7 +876,7 @@ altstack_handle_and_restore (MonoContext *ctx, MonoObject *obj, guint32 flags)
 
        if (!ji || (!stack_ovf && !nullref)) {
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGSEGV), ctx, NULL, NULL);
+                       mono_handle_native_crash (mono_get_signame (SIGSEGV), ctx, NULL);
                // if couldn't dump or if mono_handle_native_crash returns, abort
                abort ();
        }
index 0769a25..867dd1e 100644 (file)
@@ -676,7 +676,7 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s
        }
        if (!ji)
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGSEGV), (MonoContext*)sigctx, siginfo, sigctx);
+                       mono_handle_native_crash (mono_get_signame (SIGSEGV), (MonoContext*)sigctx, siginfo);
        /* setup a call frame on the real stack so that control is returned there
         * and exception handling can continue.
         * The frame looks like:
index ef99275..d2b3201 100644 (file)
@@ -67,7 +67,7 @@ static LONG CALLBACK seh_unhandled_exception_filter(EXCEPTION_POINTERS* ep)
        }
 #endif
        if (mono_dump_start ())
-               mono_handle_native_crash (mono_get_signame (SIGSEGV), NULL, NULL, NULL);
+               mono_handle_native_crash (mono_get_signame (SIGSEGV), NULL, NULL);
 
        return EXCEPTION_CONTINUE_SEARCH;
 }
@@ -1140,7 +1140,7 @@ mono_arch_handle_altstack_exception (void *sigctx, MONO_SIG_HANDLER_INFO_TYPE *s
                MonoContext mctx;
                mono_sigctx_to_monoctx (sigctx, &mctx);
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, siginfo, sigctx);
+                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, siginfo);
                else
                        abort ();
        }
index 9f88c52..0a5ce18 100644 (file)
@@ -3399,7 +3399,7 @@ print_stack_frame_to_string (StackFrameInfo *frame, MonoContext *ctx, gpointer d
  *   printing diagnostic information and aborting.
  */
 void
-mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, void *context)
+mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info)
 {
        MonoJitTlsData *jit_tls = mono_tls_get_jit_tls ();
 
@@ -3409,20 +3409,17 @@ mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLE
        sigemptyset (&sa.sa_mask);
        sa.sa_flags = 0;
 
-       /* Mono has crashed - remove our handlers except SIGTERM, which is used by crash reporting */
-       /*  TODO: Combine with mono_runtime_cleanup_handlers (but with an option to not de-allocate anything) */
-       if (mini_debug_options.handle_sigint) {
-               g_assert (sigaction (SIGINT, &sa, NULL) != -1);
-       }
-
+       /* Remove our SIGABRT handler */
        g_assert (sigaction (SIGABRT, &sa, NULL) != -1);
-       g_assert (sigaction (SIGFPE, &sa, NULL) != -1);
-       g_assert (sigaction (SIGSYS, &sa, NULL) != -1);
-       g_assert (sigaction (SIGSEGV, &sa, NULL) != -1);
-       g_assert (sigaction (SIGQUIT, &sa, NULL) != -1);
-       g_assert (sigaction (SIGBUS, &sa, NULL) != -1);
+
+       /* On some systems we get a SIGILL when calling abort (), because it might
+        * fail to raise SIGABRT */
        g_assert (sigaction (SIGILL, &sa, NULL) != -1);
+
+       /* Remove SIGCHLD, it uses the finalizer thread */
        g_assert (sigaction (SIGCHLD, &sa, NULL) != -1);
+
+       /* Remove SIGQUIT, we are already dumping threads */
        g_assert (sigaction (SIGQUIT, &sa, NULL) != -1);
 
 #endif
@@ -3462,13 +3459,13 @@ mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLE
                g_async_safe_printf ("=================================================================\n");
        }
 
-       mono_post_native_crash_handler (signal, mctx, info, mono_do_crash_chaining, context);
+       mono_post_native_crash_handler (signal, mctx, info, mono_do_crash_chaining);
 }
 
 #else
 
 void
-mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, void *context)
+mono_handle_native_crash (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info)
 {
        g_assert_not_reached ();
 }
index a3cc0ed..f477464 100644 (file)
@@ -232,7 +232,7 @@ MONO_SIG_HANDLER_FUNC (static, sigabrt_signal_handler)
                        return;
                mono_sigctx_to_monoctx (ctx, &mctx);
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, info, ctx);
+                       mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, info);
                else
                        abort ();
        }
@@ -254,7 +254,7 @@ MONO_SIG_HANDLER_FUNC (static, sigterm_signal_handler)
        // running. Returns FALSE on unrecoverable error.
        if (mono_dump_start ()) {
                // Process was killed from outside since crash reporting wasn't running yet.
-               mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, NULL, ctx);
+               mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, NULL);
        } else {
                // Crash reporting already running and we got a second SIGTERM from as part of thread-summarizing
                if (!mono_threads_summarize_execute (&mctx, &output, &hashes, FALSE, NULL, 0))
@@ -1107,7 +1107,7 @@ mono_dump_native_crash_info (const char *signal, MonoContext *mctx, MONO_SIG_HAN
 }
 
 void
-mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining, void *context)
+mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining)
 {
        if (!crash_chaining) {
                /*Android abort is a fluke, it doesn't abort, it triggers another segv. */
@@ -1117,11 +1117,6 @@ mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_
                abort ();
 #endif
        }
-       mono_chain_signal (info->si_signo, info, context);
-
-       // we remove Mono's signal handlers from crashing signals in mono_handle_native_crash(), so re-raising will now allow the OS to handle the crash
-       // TODO: perhaps we can always use this to abort, instead of explicit exit()/abort() as we do above
-       raise (info->si_signo);
 }
 #endif /* !MONO_CROSS_COMPILE */
 
index c2f4ebb..24f5402 100644 (file)
@@ -3442,8 +3442,11 @@ MONO_SIG_HANDLER_FUNC (, mono_sigfpe_signal_handler)
 
                mono_sigctx_to_monoctx (ctx, &mctx);
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGFPE), &mctx, info, ctx);
-               goto exit;
+                       mono_handle_native_crash (mono_get_signame (SIGFPE), &mctx, info);
+               if (mono_do_crash_chaining) {
+                       mono_chain_signal (MONO_SIG_HANDLER_PARAMS);
+                       goto exit;
+               }
        }
 
        mono_arch_handle_exception (ctx, exc);
@@ -3464,10 +3467,14 @@ MONO_SIG_HANDLER_FUNC (, mono_crashing_signal_handler)
        mono_sigctx_to_monoctx (ctx, &mctx);
        if (mono_dump_start ())
 #if defined(HAVE_SIG_INFO) && !defined(HOST_WIN32) // info is a siginfo_t
-               mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, info, ctx);
+               mono_handle_native_crash (mono_get_signame (info->si_signo), &mctx, info);
 #else
-               mono_handle_native_crash (mono_get_signame (SIGTERM), &mctx, info, ctx);
+               mono_handle_native_crash (mono_get_signame (SIGTERM), &mctx, info);
 #endif
+       if (mono_do_crash_chaining) {
+               mono_chain_signal (MONO_SIG_HANDLER_PARAMS);
+               return;
+       }
 }
 
 #if defined(MONO_ARCH_USE_SIGACTION) || defined(HOST_WIN32)
@@ -3547,7 +3554,11 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler)
                if (!mono_do_crash_chaining && mono_chain_signal (MONO_SIG_HANDLER_PARAMS))
                        return;
                if (mono_dump_start())
-                       mono_handle_native_crash (mono_get_signame (signo), &mctx, info, ctx);
+                       mono_handle_native_crash (mono_get_signame (signo), &mctx, info);
+               if (mono_do_crash_chaining) {
+                       mono_chain_signal (MONO_SIG_HANDLER_PARAMS);
+                       return;
+               }
        }
 #endif
 
@@ -3586,7 +3597,7 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler)
                } else {
                        // FIXME: This shouldn't run on the altstack
                        if (mono_dump_start ())
-                               mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, info, ctx);
+                               mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, info);
                }
 #endif
        }
@@ -3597,14 +3608,23 @@ MONO_SIG_HANDLER_FUNC (, mono_sigsegv_signal_handler)
                        return;
 
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, (MONO_SIG_HANDLER_INFO_TYPE*)info, ctx);
+                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, (MONO_SIG_HANDLER_INFO_TYPE*)info);
+
+               if (mono_do_crash_chaining) {
+                       mono_chain_signal (MONO_SIG_HANDLER_PARAMS);
+                       return;
+               }
        }
 
        if (mono_is_addr_implicit_null_check (fault_addr)) {
                mono_arch_handle_exception (ctx, NULL);
        } else {
                if (mono_dump_start ())
-                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, (MONO_SIG_HANDLER_INFO_TYPE*)info, ctx);
+                       mono_handle_native_crash (mono_get_signame (SIGSEGV), &mctx, (MONO_SIG_HANDLER_INFO_TYPE*)info);
+               if (mono_do_crash_chaining) {
+                       mono_chain_signal (MONO_SIG_HANDLER_PARAMS);
+                       return;
+               }
        }
 #endif
 }
index 9eea434..47540a1 100644 (file)
@@ -559,7 +559,7 @@ void
 mono_dump_native_crash_info (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info);
 
 void
-mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining, void *context);
+mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining);
 
 gboolean
 mono_is_addr_implicit_null_check (void *addr);
index 13a8be5..eca6011 100644 (file)
@@ -281,7 +281,7 @@ mono_dump_native_crash_info (const char *signal, MonoContext *mctx, MONO_SIG_HAN
 }
 
 void
-mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining, void *context)
+mono_post_native_crash_handler (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *info, gboolean crash_chaining)
 {
        if (!crash_chaining)
                abort ();
index b242d12..6038153 100644 (file)
@@ -2520,7 +2520,7 @@ typedef gboolean (*MonoJitStackWalk)            (StackFrameInfo *frame, MonoCont
 
 void     mono_exceptions_init                   (void);
 gboolean mono_handle_exception                  (MonoContext *ctx, gpointer obj);
-void     mono_handle_native_crash               (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo, void *context);
+void     mono_handle_native_crash               (const char *signal, MonoContext *mctx, MONO_SIG_HANDLER_INFO_TYPE *siginfo);
 MONO_API void     mono_print_thread_dump                 (void *sigctx);
 MONO_API void     mono_print_thread_dump_from_ctx        (MonoContext *ctx);
 void     mono_walk_stack_with_ctx               (MonoJitStackWalk func, MonoContext *start_ctx, MonoUnwindOptions unwind_options, void *user_data);