OSDN Git Service

Fix deadlock when killing adb bugreport
authorAndres Morales <anmorales@google.com>
Thu, 21 Aug 2014 19:38:22 +0000 (12:38 -0700)
committerAndres Morales <anmorales@google.com>
Fri, 22 Aug 2014 19:10:44 +0000 (12:10 -0700)
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
cmds/dumpstate/utils.c

index 342dc89..ffc8714 100644 (file)
@@ -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");
index a6d9ef6..85c353e 100644 (file)
@@ -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);