From 2e671bbdb741c2926b6df7b240fdc31c7361f330 Mon Sep 17 00:00:00 2001 From: Andres Morales Date: Thu, 21 Aug 2014 12:38:22 -0700 Subject: [PATCH] Fix deadlock when killing adb bugreport Leave default signal handler (terminate) for parent process, add SIG_IGN as signal handler for children and let them go down when the parent gets SIGPIPE. Bug: 17109154 Change-Id: Id33db3e97a32f289eb2a9a1a0ca8acbe3dcd285d --- cmds/dumpstate/dumpstate.c | 6 ++++-- cmds/dumpstate/utils.c | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index 342dc89ca..ffc8714c3 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -378,8 +378,8 @@ static void usage() { } static void sigpipe_handler(int n) { - (void)n; - exit(EXIT_FAILURE); + // don't complain to stderr or stdout + _exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { @@ -404,10 +404,12 @@ int main(int argc, char *argv[]) { } ALOGI("begin\n"); + memset(&sigact, 0, sizeof(sigact)); sigact.sa_handler = sigpipe_handler; sigaction(SIGPIPE, &sigact, NULL); + /* set as high priority, and protect from OOM killer */ setpriority(PRIO_PROCESS, 0, -20); FILE *oom_adj = fopen("/proc/self/oom_adj", "w"); diff --git a/cmds/dumpstate/utils.c b/cmds/dumpstate/utils.c index a6d9ef6bd..85c353e10 100644 --- a/cmds/dumpstate/utils.c +++ b/cmds/dumpstate/utils.c @@ -313,6 +313,12 @@ int run_command(const char *title, int timeout_seconds, const char *command, ... /* make sure the child dies when dumpstate dies */ prctl(PR_SET_PDEATHSIG, SIGKILL); + /* just ignore SIGPIPE, will go down with parent's */ + struct sigaction sigact; + memset(&sigact, 0, sizeof(sigact)); + sigact.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &sigact, NULL); + va_list ap; va_start(ap, command); if (title) printf("------ %s (%s", title, command);