Add metadata and headers to incident reports.
+ Remove the spawned thread inside the ReportFile for filter_and_write_report
because it leads to accessing freed memory
Instead, let the caller of ReportFile::startFileteringData create the thread.
ReportFile class shouldn't care about whether it's writing to a pipe for IPC
or regular file.
+ Add uri building in incidentd
+ Add metadata and headers to incident reports
Test: existing passed tests in incidentd_test still pass.
Manually tested with statsd
Change-Id: I5fef900d31f5d181275814f1e1c8c98443f201a7
diff --git a/cmds/incidentd/src/Broadcaster.cpp b/cmds/incidentd/src/Broadcaster.cpp
index 39e5393..63464f2 100644
--- a/cmds/incidentd/src/Broadcaster.cpp
+++ b/cmds/incidentd/src/Broadcaster.cpp
@@ -22,6 +22,7 @@
#include <android/os/DropBoxManager.h>
#include <binder/IServiceManager.h>
+#include <thread>
namespace android {
namespace os {
@@ -391,13 +392,20 @@
return NO_ERROR;
}
- // Start a thread to write the data to dropbox.
- int readFd = -1;
- err = file->startFilteringData(&readFd, args);
- if (err != NO_ERROR) {
- return err;
+ int fds[2];
+ if (pipe(fds) != 0) {
+ ALOGW("Error opening pipe to filter incident report: %s", file->getDataFileName().c_str());
+ return NO_ERROR;
}
+ int readFd = fds[0];
+ int writeFd = fds[1];
+
+ // spawn a thread to write the data. Release the writeFd ownership to the thread.
+ thread th([file, writeFd, args]() { file->startFilteringData(writeFd, args); });
+
+ th.detach();
+
// Takes ownership of readFd.
Status status = dropbox->addFile(String16("incident"), readFd, 0);
if (!status.isOk()) {