From 529b3066d5124f07a2566d315fda3e5129ab8a25 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Wed, 25 Jan 2017 11:05:11 -0800 Subject: [PATCH] debuggerd_handler: don't resend nonfatal signals when not dumping. Bug: http://b/34516140 Test: debuggerd -b `pidof surfaceflinger` Change-Id: I0275ffca24bf4840e264eaa4b79611e2404edfb0 --- debuggerd/handler/debuggerd_handler.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/debuggerd/handler/debuggerd_handler.cpp b/debuggerd/handler/debuggerd_handler.cpp index 8ea06c0a3..1af0bd1af 100644 --- a/debuggerd/handler/debuggerd_handler.cpp +++ b/debuggerd/handler/debuggerd_handler.cpp @@ -236,7 +236,7 @@ static int debuggerd_dispatch_pseudothread(void* arg) { return 0; } -static void resend_signal(siginfo_t* info) { +static void resend_signal(siginfo_t* info, bool crash_dump_started) { // Signals can either be fatal or nonfatal. // For fatal signals, crash_dump will send us the signal we crashed with // before resuming us, so that processes using waitpid on us will see that we @@ -254,9 +254,11 @@ static void resend_signal(siginfo_t* info) { // all signals when registering the handler, so resending the signal (using // rt_tgsigqueueinfo(2) to preserve SA_SIGINFO) will cause it to be delivered // when our signal handler returns. - int rc = syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), info->si_signo, info); - if (rc != 0) { - fatal("failed to resend signal during crash: %s", strerror(errno)); + if (crash_dump_started || info->si_signo != DEBUGGER_SIGNAL) { + int rc = syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), info->si_signo, info); + if (rc != 0) { + fatal("failed to resend signal during crash: %s", strerror(errno)); + } } if (info->si_signo == DEBUGGER_SIGNAL) { @@ -300,7 +302,7 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void*) __libc_format_log(ANDROID_LOG_INFO, "libc", "Suppressing debuggerd output because prctl(PR_GET_DUMPABLE)==0"); - resend_signal(info); + resend_signal(info, false); return; } @@ -346,7 +348,7 @@ static void debuggerd_signal_handler(int signal_number, siginfo_t* info, void*) signal(signal_number, SIG_DFL); } - resend_signal(info); + resend_signal(info, thread_info.crash_dump_started); } void debuggerd_init(debuggerd_callbacks_t* callbacks) {