Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 529b3066 authored by Josh Gao's avatar Josh Gao
Browse files

debuggerd_handler: don't resend nonfatal signals when not dumping.

Bug: http://b/34516140
Test: debuggerd -b `pidof surfaceflinger`
Change-Id: I0275ffca24bf4840e264eaa4b79611e2404edfb0
parent fc12c4b8
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -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,10 +254,12 @@ 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.
  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) {
    pthread_mutex_unlock(&crash_mutex);
@@ -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) {