Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df8ec9fc authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Modify SystemApi so it can be used by CTS to trigger incident report"

parents 031d5d65 3ec5cc79
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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:
@@ -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);
}
+6 −5
Original line number Diff line number Diff line
@@ -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.
@@ -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
+11 −1
Original line number Diff line number Diff line
@@ -64,7 +64,8 @@ ReportRequest::ok()
ReportRequestSet::ReportRequestSet()
    :mRequests(),
     mSections(),
     mMainFd(-1)
     mMainFd(-1),
     mMainDest(-1)
{
}

@@ -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);
@@ -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;
        }
    }
@@ -154,6 +163,7 @@ Reporter::runReport()

        // Add to the set
        batch.setMainFd(mainFd);
        batch.setMainDest(mainDest);
    }

    // Tell everyone that we're starting.
+3 −0
Original line number Diff line number Diff line
@@ -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;

@@ -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;
};

// ================================================================================
+12 −7
Original line number Diff line number Diff line
@@ -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;

@@ -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