diff options
author | Andres Morales <anmorales@google.com> | 2014-08-21 12:38:22 -0700 |
---|---|---|
committer | Andres Morales <anmorales@google.com> | 2014-08-22 12:10:44 -0700 |
commit | 2e671bbdb741c2926b6df7b240fdc31c7361f330 (patch) | |
tree | 9ab264a786cbb21c93cec436b11f6cc40da0fda8 /cmds | |
parent | 61a4eecbe615bc94944161c4cf4aa590dfca1b2e (diff) | |
download | frameworks_native-2e671bbdb741c2926b6df7b240fdc31c7361f330.zip frameworks_native-2e671bbdb741c2926b6df7b240fdc31c7361f330.tar.gz frameworks_native-2e671bbdb741c2926b6df7b240fdc31c7361f330.tar.bz2 |
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
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/dumpstate/dumpstate.c | 6 | ||||
-rw-r--r-- | 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 342dc89..ffc8714 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 a6d9ef6..85c353e 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); |