From 885f888c55587e9366542b5155a06c321cde175a Mon Sep 17 00:00:00 2001 From: John Michelau Date: Mon, 6 May 2013 16:42:02 -0500 Subject: [PATCH] Exit dumpstate on SIGPIPE to avoid cascading child crashes When dumpstate ignores SIGPIPE it can lead to a cascade of tombstones / coredumps since many of its children don't handle or ignore it. It's best to just exit dumpstate once the pipe is broken. Change-Id: Ic0c57ecf4171f0c0a07837e51c41cb1876e1350c --- cmds/dumpstate/dumpstate.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index 55a36c230..dbe98322c 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -314,7 +314,13 @@ static void usage() { ); } +static void sigpipe_handler(int n) { + (void)n; + exit(EXIT_FAILURE); +} + int main(int argc, char *argv[]) { + struct sigaction sigact; int do_add_date = 0; int do_compress = 0; int do_vibrate = 1; @@ -334,7 +340,9 @@ int main(int argc, char *argv[]) { } ALOGI("begin\n"); - signal(SIGPIPE, SIG_IGN); + 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);