Loading cmds/incidentd/src/Privacy.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest) bool PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; } PrivacySpec new_spec_from_args(int dest) PrivacySpec PrivacySpec::new_spec(int dest) { switch (dest) { case android::os::DEST_AUTOMATIC: Loading @@ -77,4 +77,7 @@ PrivacySpec new_spec_from_args(int dest) } } PrivacySpec get_default_dropbox_spec() { return PrivacySpec(android::os::DEST_AUTOMATIC); } No newline at end of file PrivacySpec PrivacySpec::get_default_dropbox_spec() { return PrivacySpec(android::os::DEST_AUTOMATIC); } cmds/incidentd/src/Privacy.h +6 −5 Original line number Diff line number Diff line Loading @@ -65,8 +65,6 @@ public: const uint8_t dest; PrivacySpec() : dest(DEST_DEFAULT_VALUE) {} PrivacySpec(uint8_t dest) : dest(dest) {} bool operator<(const PrivacySpec& other) const; // check permission of a policy, if returns true, don't strip the data. Loading @@ -74,9 +72,12 @@ public: // if returns true, no data need to be stripped. bool RequireAll() const; }; PrivacySpec new_spec_from_args(int dest); PrivacySpec get_default_dropbox_spec(); // Constructs spec using static methods below. static PrivacySpec new_spec(int dest); static PrivacySpec get_default_dropbox_spec(); private: PrivacySpec(uint8_t dest) : dest(dest) {} }; #endif // PRIVACY_H cmds/incidentd/src/Reporter.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,8 @@ ReportRequest::ok() ReportRequestSet::ReportRequestSet() :mRequests(), mSections(), mMainFd(-1) mMainFd(-1), mMainDest(-1) { } Loading @@ -86,6 +87,12 @@ ReportRequestSet::setMainFd(int fd) mMainFd = fd; } void ReportRequestSet::setMainDest(int dest) { mMainDest = dest; } bool ReportRequestSet::containsSection(int id) { return mSections.containsSection(id); Loading Loading @@ -125,12 +132,14 @@ Reporter::runReport() status_t err = NO_ERROR; bool needMainFd = false; int mainFd = -1; int mainDest = -1; HeaderSection headers; // See if we need the main file for (ReportRequestSet::iterator it=batch.begin(); it!=batch.end(); it++) { if ((*it)->fd < 0 && mainFd < 0) { needMainFd = true; mainDest = (*it)->args.dest(); break; } } Loading @@ -154,6 +163,7 @@ Reporter::runReport() // Add to the set batch.setMainFd(mainFd); batch.setMainDest(mainDest); } // Tell everyone that we're starting. Loading cmds/incidentd/src/Reporter.h +3 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ public: void add(const sp<ReportRequest>& request); void setMainFd(int fd); void setMainDest(int dest); typedef vector<sp<ReportRequest>>::iterator iterator; Loading @@ -61,10 +62,12 @@ public: int mainFd() { return mMainFd; } bool containsSection(int id); int mainDest() { return mMainDest; } private: vector<sp<ReportRequest>> mRequests; IncidentReportArgs mSections; int mMainFd; int mMainDest; }; // ================================================================================ Loading cmds/incidentd/src/Section.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -152,36 +152,40 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re // The streaming ones, group requests by spec in order to save unnecessary strip operations map<PrivacySpec, vector<sp<ReportRequest>>> requestsBySpec; for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) { for (auto it = requests->begin(); it != requests->end(); it++) { sp<ReportRequest> request = *it; if (!request->ok() || !request->args.containsSection(id)) { continue; // skip invalid request } PrivacySpec spec = new_spec_from_args(request->args.dest()); PrivacySpec spec = PrivacySpec::new_spec(request->args.dest()); requestsBySpec[spec].push_back(request); } for (map<PrivacySpec, vector<sp<ReportRequest>>>::iterator mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) { for (auto mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) { PrivacySpec spec = mit->first; err = privacyBuffer.strip(spec); if (err != NO_ERROR) return err; // it means the privacyBuffer data is corrupted. if (privacyBuffer.size() == 0) continue; for (vector<sp<ReportRequest>>::iterator it = mit->second.begin(); it != mit->second.end(); it++) { for (auto it = mit->second.begin(); it != mit->second.end(); it++) { sp<ReportRequest> request = *it; err = write_section_header(request->fd, id, privacyBuffer.size()); if (err != NO_ERROR) { request->err = err; continue; } err = privacyBuffer.flush(request->fd); if (err != NO_ERROR) { request->err = err; continue; } writeable++; ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(), request->fd, spec.dest); ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(), request->fd, spec.dest); } privacyBuffer.clear(); } // The dropbox file if (requests->mainFd() >= 0) { err = privacyBuffer.strip(get_default_dropbox_spec()); PrivacySpec spec = requests->mainDest() < 0 ? PrivacySpec::get_default_dropbox_spec() : PrivacySpec::new_spec(requests->mainDest()); err = privacyBuffer.strip(spec); if (err != NO_ERROR) return err; // the buffer data is corrupted. if (privacyBuffer.size() == 0) goto DONE; Loading @@ -190,7 +194,8 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re err = privacyBuffer.flush(requests->mainFd()); if (err != NO_ERROR) { requests->setMainFd(-1); goto DONE; } writeable++; ALOGD("Section %d flushed %zu bytes to dropbox %d", id, privacyBuffer.size(), requests->mainFd()); ALOGD("Section %d flushed %zu bytes to dropbox %d with spec %d", id, privacyBuffer.size(), requests->mainFd(), spec.dest); } DONE: Loading Loading
cmds/incidentd/src/Privacy.cpp +5 −2 Original line number Diff line number Diff line Loading @@ -65,7 +65,7 @@ PrivacySpec::CheckPremission(const Privacy* privacy, const uint8_t defaultDest) bool PrivacySpec::RequireAll() const { return dest == android::os::DEST_LOCAL; } PrivacySpec new_spec_from_args(int dest) PrivacySpec PrivacySpec::new_spec(int dest) { switch (dest) { case android::os::DEST_AUTOMATIC: Loading @@ -77,4 +77,7 @@ PrivacySpec new_spec_from_args(int dest) } } PrivacySpec get_default_dropbox_spec() { return PrivacySpec(android::os::DEST_AUTOMATIC); } No newline at end of file PrivacySpec PrivacySpec::get_default_dropbox_spec() { return PrivacySpec(android::os::DEST_AUTOMATIC); }
cmds/incidentd/src/Privacy.h +6 −5 Original line number Diff line number Diff line Loading @@ -65,8 +65,6 @@ public: const uint8_t dest; PrivacySpec() : dest(DEST_DEFAULT_VALUE) {} PrivacySpec(uint8_t dest) : dest(dest) {} bool operator<(const PrivacySpec& other) const; // check permission of a policy, if returns true, don't strip the data. Loading @@ -74,9 +72,12 @@ public: // if returns true, no data need to be stripped. bool RequireAll() const; }; PrivacySpec new_spec_from_args(int dest); PrivacySpec get_default_dropbox_spec(); // Constructs spec using static methods below. static PrivacySpec new_spec(int dest); static PrivacySpec get_default_dropbox_spec(); private: PrivacySpec(uint8_t dest) : dest(dest) {} }; #endif // PRIVACY_H
cmds/incidentd/src/Reporter.cpp +11 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,8 @@ ReportRequest::ok() ReportRequestSet::ReportRequestSet() :mRequests(), mSections(), mMainFd(-1) mMainFd(-1), mMainDest(-1) { } Loading @@ -86,6 +87,12 @@ ReportRequestSet::setMainFd(int fd) mMainFd = fd; } void ReportRequestSet::setMainDest(int dest) { mMainDest = dest; } bool ReportRequestSet::containsSection(int id) { return mSections.containsSection(id); Loading Loading @@ -125,12 +132,14 @@ Reporter::runReport() status_t err = NO_ERROR; bool needMainFd = false; int mainFd = -1; int mainDest = -1; HeaderSection headers; // See if we need the main file for (ReportRequestSet::iterator it=batch.begin(); it!=batch.end(); it++) { if ((*it)->fd < 0 && mainFd < 0) { needMainFd = true; mainDest = (*it)->args.dest(); break; } } Loading @@ -154,6 +163,7 @@ Reporter::runReport() // Add to the set batch.setMainFd(mainFd); batch.setMainDest(mainDest); } // Tell everyone that we're starting. Loading
cmds/incidentd/src/Reporter.h +3 −0 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ public: void add(const sp<ReportRequest>& request); void setMainFd(int fd); void setMainDest(int dest); typedef vector<sp<ReportRequest>>::iterator iterator; Loading @@ -61,10 +62,12 @@ public: int mainFd() { return mMainFd; } bool containsSection(int id); int mainDest() { return mMainDest; } private: vector<sp<ReportRequest>> mRequests; IncidentReportArgs mSections; int mMainFd; int mMainDest; }; // ================================================================================ Loading
cmds/incidentd/src/Section.cpp +12 −7 Original line number Diff line number Diff line Loading @@ -152,36 +152,40 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re // The streaming ones, group requests by spec in order to save unnecessary strip operations map<PrivacySpec, vector<sp<ReportRequest>>> requestsBySpec; for (ReportRequestSet::iterator it = requests->begin(); it != requests->end(); it++) { for (auto it = requests->begin(); it != requests->end(); it++) { sp<ReportRequest> request = *it; if (!request->ok() || !request->args.containsSection(id)) { continue; // skip invalid request } PrivacySpec spec = new_spec_from_args(request->args.dest()); PrivacySpec spec = PrivacySpec::new_spec(request->args.dest()); requestsBySpec[spec].push_back(request); } for (map<PrivacySpec, vector<sp<ReportRequest>>>::iterator mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) { for (auto mit = requestsBySpec.begin(); mit != requestsBySpec.end(); mit++) { PrivacySpec spec = mit->first; err = privacyBuffer.strip(spec); if (err != NO_ERROR) return err; // it means the privacyBuffer data is corrupted. if (privacyBuffer.size() == 0) continue; for (vector<sp<ReportRequest>>::iterator it = mit->second.begin(); it != mit->second.end(); it++) { for (auto it = mit->second.begin(); it != mit->second.end(); it++) { sp<ReportRequest> request = *it; err = write_section_header(request->fd, id, privacyBuffer.size()); if (err != NO_ERROR) { request->err = err; continue; } err = privacyBuffer.flush(request->fd); if (err != NO_ERROR) { request->err = err; continue; } writeable++; ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(), request->fd, spec.dest); ALOGD("Section %d flushed %zu bytes to fd %d with spec %d", id, privacyBuffer.size(), request->fd, spec.dest); } privacyBuffer.clear(); } // The dropbox file if (requests->mainFd() >= 0) { err = privacyBuffer.strip(get_default_dropbox_spec()); PrivacySpec spec = requests->mainDest() < 0 ? PrivacySpec::get_default_dropbox_spec() : PrivacySpec::new_spec(requests->mainDest()); err = privacyBuffer.strip(spec); if (err != NO_ERROR) return err; // the buffer data is corrupted. if (privacyBuffer.size() == 0) goto DONE; Loading @@ -190,7 +194,8 @@ write_report_requests(const int id, const FdBuffer& buffer, ReportRequestSet* re err = privacyBuffer.flush(requests->mainFd()); if (err != NO_ERROR) { requests->setMainFd(-1); goto DONE; } writeable++; ALOGD("Section %d flushed %zu bytes to dropbox %d", id, privacyBuffer.size(), requests->mainFd()); ALOGD("Section %d flushed %zu bytes to dropbox %d with spec %d", id, privacyBuffer.size(), requests->mainFd(), spec.dest); } DONE: Loading