Call _exit() instead of exit() on child failure.
As explained on man _exit:
"The function _exit() terminates the calling process "immediately".
Any open file descriptors belonging to the process are closed;"
If exit() is called instead, the resulting zip file will be corrupted.
BUG: 27900023
BUG: 27804637
Change-Id: I6591749603753d6016f350c629b7082cf6780ae2
diff --git a/cmds/dumpstate/dumpstate.cpp b/cmds/dumpstate/dumpstate.cpp
index bb485bf..30ddec3 100644
--- a/cmds/dumpstate/dumpstate.cpp
+++ b/cmds/dumpstate/dumpstate.cpp
@@ -201,7 +201,8 @@
execl("/system/bin/atrace", "/system/bin/atrace", "--async_dump", nullptr);
// execl should never return, but if it did, we need to exit.
MYLOGD("execl on '/system/bin/atrace --async_dump' failed: %s", strerror(errno));
- exit(EXIT_FAILURE);
+ // Must call _exit (instead of exit), otherwise it will corrupt the zip file.
+ _exit(EXIT_FAILURE);
} else {
close(pipefd[1]); // close the write end of the pipe in the parent
add_zip_entry_from_fd("systrace.txt", pipefd[0]); // write output to zip file