Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ cc_library { "core/proto/android/os/kernelwake.proto", "core/proto/android/os/procrank.proto", "core/proto/android/service/graphicsstats.proto", "libs/incident/proto/android/privacy.proto", ], shared: { enabled: false, Loading cmds/incidentd/src/EncodedBuffer.cpp +25 −25 Original line number Diff line number Diff line Loading @@ -27,15 +27,15 @@ const size_t BUFFER_SIZE = 4 * 1024; // 4 KB * Return the number of bytes of the varint. */ static uint32_t read_raw_varint(FdBuffer::iterator& it) read_raw_varint(FdBuffer::iterator* it) { uint32_t val = 0; int i = 0; bool hasNext = true; while (hasNext) { hasNext = ((*it & 0x80) != 0); val += (*it & 0x7F) << (7*i); it++; hasNext = ((**it & 0x80) != 0); val += (**it & 0x7F) << (7*i); (*it)++; i++; } return val; Loading @@ -46,21 +46,21 @@ read_raw_varint(FdBuffer::iterator& it) * If skip is set to true, no data will be written to buf. Return number of bytes written. */ static size_t write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t wireType, bool skip) write_field_or_skip(FdBuffer::iterator* iter, vector<uint8_t>* buf, uint8_t wireType, bool skip) { FdBuffer::iterator snapshot = iterator.snapshot(); FdBuffer::iterator snapshot = iter->snapshot(); size_t bytesToWrite = 0; uint32_t varint = 0; switch (wireType) { case WIRE_TYPE_VARINT: varint = read_raw_varint(iterator); varint = read_raw_varint(iter); if(!skip) return write_raw_varint(buf, varint); break; case WIRE_TYPE_FIXED64: bytesToWrite = 8; break; case WIRE_TYPE_LENGTH_DELIMITED: bytesToWrite = read_raw_varint(iterator); bytesToWrite = read_raw_varint(iter); if(!skip) write_raw_varint(buf, bytesToWrite); break; case WIRE_TYPE_FIXED32: Loading @@ -68,14 +68,14 @@ write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t break; } if (skip) { iterator += bytesToWrite; *iter += bytesToWrite; } else { for (size_t i=0; i<bytesToWrite; i++) { buf.push_back(*iterator); iterator++; buf->push_back(**iter); (*iter)++; } } return skip ? 0 : iterator - snapshot; return skip ? 0 : *iter - snapshot; } /** Loading @@ -86,30 +86,30 @@ write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t * After exit with NO_ERROR, iterator points to the next protobuf field's head. */ static status_t stripField(FdBuffer::iterator &iterator, vector<uint8_t> &buf, const Privacy* parentPolicy, const PrivacySpec& spec) stripField(FdBuffer::iterator* iter, vector<uint8_t>* buf, const Privacy* parentPolicy, const PrivacySpec& spec) { if (iterator.outOfBound() || parentPolicy == NULL) return BAD_VALUE; if (iter->outOfBound() || parentPolicy == NULL) return BAD_VALUE; uint32_t varint = read_raw_varint(iterator); uint32_t varint = read_raw_varint(iter); uint8_t wireType = read_wire_type(varint); uint32_t fieldId = read_field_id(varint); const Privacy* policy = parentPolicy->lookup(fieldId); if (policy == NULL || !policy->IsMessageType() || !policy->HasChildren()) { bool skip = !spec.CheckPremission(policy); size_t amt = buf.size(); size_t amt = buf->size(); if (!skip) amt += write_header(buf, fieldId, wireType); amt += write_field_or_skip(iterator, buf, wireType, skip); // point to head of next field return buf.size() != amt ? BAD_VALUE : NO_ERROR; amt += write_field_or_skip(iter, buf, wireType, skip); // point to head of next field return buf->size() != amt ? BAD_VALUE : NO_ERROR; } // current field is message type and its sub-fields have extra privacy policies deque<vector<uint8_t>> q; uint32_t msgSize = read_raw_varint(iterator); uint32_t msgSize = read_raw_varint(iter); size_t finalSize = 0; FdBuffer::iterator start = iterator.snapshot(); while ((iterator - start) != (int)msgSize) { FdBuffer::iterator start = iter->snapshot(); while ((*iter - start) != (int)msgSize) { vector<uint8_t> v; status_t err = stripField(iterator, v, policy, spec); status_t err = stripField(iter, &v, policy, spec); if (err != NO_ERROR) return err; if (v.empty()) continue; q.push_back(v); Loading @@ -118,11 +118,11 @@ stripField(FdBuffer::iterator &iterator, vector<uint8_t> &buf, const Privacy* pa write_header(buf, fieldId, wireType); write_raw_varint(buf, finalSize); buf.reserve(finalSize); buf->reserve(finalSize); // reserve the size of the field while (!q.empty()) { vector<uint8_t> subField = q.front(); for (vector<uint8_t>::iterator it = subField.begin(); it != subField.end(); it++) { buf.push_back(*it); buf->push_back(*it); } q.pop_front(); } Loading Loading @@ -156,7 +156,7 @@ EncodedBuffer::strip(const PrivacySpec& spec) field.reserve(BUFFER_SIZE); while (it != mFdBuffer.end()) { status_t err = stripField(it, field, mPolicy, spec); status_t err = stripField(&it, &field, mPolicy, spec); if (err != NO_ERROR) return err; if (field.size() > BUFFER_SIZE) { // rotate to another chunk if buffer size exceeds mBuffers.push_back(field); Loading cmds/incidentd/src/Privacy.cpp +2 −27 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "Privacy.h" #include <stdlib.h> // DESTINATION enum value const uint8_t DEST_LOCAL = 0; const uint8_t DEST_EXPLICIT = 1; Loading @@ -25,33 +27,6 @@ const uint8_t DEST_AUTOMATIC = 2; const uint8_t TYPE_STRING = 9; const uint8_t TYPE_MESSAGE = 11; Privacy::Privacy(uint32_t field_id, uint8_t type, uint8_t dest) : field_id(field_id), type(type), children(NULL), dest(dest), patterns(NULL) { } Privacy::Privacy(uint32_t field_id, const Privacy** children) : field_id(field_id), type(TYPE_MESSAGE), children(children), dest(DEST_DEFAULT_VALUE), // this will be ignored patterns(NULL) { } Privacy::Privacy(uint32_t field_id, uint8_t dest, const char** patterns) : field_id(field_id), type(TYPE_STRING), children(NULL), dest(dest), patterns(patterns) { } bool Privacy::IsMessageType() const { return type == TYPE_MESSAGE; } Loading cmds/incidentd/src/Privacy.h +1 −5 Original line number Diff line number Diff line Loading @@ -30,17 +30,13 @@ struct Privacy { uint32_t field_id; uint8_t type; // ignore parent's privacy flags if children are set, NULL-terminated const Privacy** children; Privacy** children; // the following fields are identitical to // frameworks/base/libs/incident/proto/android/privacy.proto uint8_t dest; const char** patterns; // only set when type is string Privacy(uint32_t field_id, uint8_t type, uint8_t dest); // generic constructor Privacy(uint32_t field_id, const Privacy** children); // used for message type Privacy(uint32_t field_id, uint8_t dest, const char** patterns); // used for string type bool IsMessageType() const; bool IsStringType() const; bool HasChildren() const; Loading cmds/incidentd/src/Section.cpp +13 −7 Original line number Diff line number Diff line Loading @@ -97,13 +97,19 @@ static status_t wait_child(pid_t pid) { static const Privacy* get_privacy_of_section(int id) { if (id < 0) return NULL; int i=0; while (PRIVACY_POLICY_LIST[i] != NULL) { const Privacy* p = PRIVACY_POLICY_LIST[i]; if (p->field_id == (uint32_t)id) return p; if (p->field_id > (uint32_t)id) return NULL; i++; int l = 0; int r = PRIVACY_POLICY_COUNT - 1; while (l <= r) { int mid = (l + r) >> 1; const Privacy* p = PRIVACY_POLICY_LIST[mid]; if (p->field_id < (uint32_t)id) { l = mid + 1; } else if (p->field_id > (uint32_t)id) { r = mid - 1; } else { return p; } } return NULL; } Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ cc_library { "core/proto/android/os/kernelwake.proto", "core/proto/android/os/procrank.proto", "core/proto/android/service/graphicsstats.proto", "libs/incident/proto/android/privacy.proto", ], shared: { enabled: false, Loading
cmds/incidentd/src/EncodedBuffer.cpp +25 −25 Original line number Diff line number Diff line Loading @@ -27,15 +27,15 @@ const size_t BUFFER_SIZE = 4 * 1024; // 4 KB * Return the number of bytes of the varint. */ static uint32_t read_raw_varint(FdBuffer::iterator& it) read_raw_varint(FdBuffer::iterator* it) { uint32_t val = 0; int i = 0; bool hasNext = true; while (hasNext) { hasNext = ((*it & 0x80) != 0); val += (*it & 0x7F) << (7*i); it++; hasNext = ((**it & 0x80) != 0); val += (**it & 0x7F) << (7*i); (*it)++; i++; } return val; Loading @@ -46,21 +46,21 @@ read_raw_varint(FdBuffer::iterator& it) * If skip is set to true, no data will be written to buf. Return number of bytes written. */ static size_t write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t wireType, bool skip) write_field_or_skip(FdBuffer::iterator* iter, vector<uint8_t>* buf, uint8_t wireType, bool skip) { FdBuffer::iterator snapshot = iterator.snapshot(); FdBuffer::iterator snapshot = iter->snapshot(); size_t bytesToWrite = 0; uint32_t varint = 0; switch (wireType) { case WIRE_TYPE_VARINT: varint = read_raw_varint(iterator); varint = read_raw_varint(iter); if(!skip) return write_raw_varint(buf, varint); break; case WIRE_TYPE_FIXED64: bytesToWrite = 8; break; case WIRE_TYPE_LENGTH_DELIMITED: bytesToWrite = read_raw_varint(iterator); bytesToWrite = read_raw_varint(iter); if(!skip) write_raw_varint(buf, bytesToWrite); break; case WIRE_TYPE_FIXED32: Loading @@ -68,14 +68,14 @@ write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t break; } if (skip) { iterator += bytesToWrite; *iter += bytesToWrite; } else { for (size_t i=0; i<bytesToWrite; i++) { buf.push_back(*iterator); iterator++; buf->push_back(**iter); (*iter)++; } } return skip ? 0 : iterator - snapshot; return skip ? 0 : *iter - snapshot; } /** Loading @@ -86,30 +86,30 @@ write_field_or_skip(FdBuffer::iterator &iterator, vector<uint8_t> &buf, uint8_t * After exit with NO_ERROR, iterator points to the next protobuf field's head. */ static status_t stripField(FdBuffer::iterator &iterator, vector<uint8_t> &buf, const Privacy* parentPolicy, const PrivacySpec& spec) stripField(FdBuffer::iterator* iter, vector<uint8_t>* buf, const Privacy* parentPolicy, const PrivacySpec& spec) { if (iterator.outOfBound() || parentPolicy == NULL) return BAD_VALUE; if (iter->outOfBound() || parentPolicy == NULL) return BAD_VALUE; uint32_t varint = read_raw_varint(iterator); uint32_t varint = read_raw_varint(iter); uint8_t wireType = read_wire_type(varint); uint32_t fieldId = read_field_id(varint); const Privacy* policy = parentPolicy->lookup(fieldId); if (policy == NULL || !policy->IsMessageType() || !policy->HasChildren()) { bool skip = !spec.CheckPremission(policy); size_t amt = buf.size(); size_t amt = buf->size(); if (!skip) amt += write_header(buf, fieldId, wireType); amt += write_field_or_skip(iterator, buf, wireType, skip); // point to head of next field return buf.size() != amt ? BAD_VALUE : NO_ERROR; amt += write_field_or_skip(iter, buf, wireType, skip); // point to head of next field return buf->size() != amt ? BAD_VALUE : NO_ERROR; } // current field is message type and its sub-fields have extra privacy policies deque<vector<uint8_t>> q; uint32_t msgSize = read_raw_varint(iterator); uint32_t msgSize = read_raw_varint(iter); size_t finalSize = 0; FdBuffer::iterator start = iterator.snapshot(); while ((iterator - start) != (int)msgSize) { FdBuffer::iterator start = iter->snapshot(); while ((*iter - start) != (int)msgSize) { vector<uint8_t> v; status_t err = stripField(iterator, v, policy, spec); status_t err = stripField(iter, &v, policy, spec); if (err != NO_ERROR) return err; if (v.empty()) continue; q.push_back(v); Loading @@ -118,11 +118,11 @@ stripField(FdBuffer::iterator &iterator, vector<uint8_t> &buf, const Privacy* pa write_header(buf, fieldId, wireType); write_raw_varint(buf, finalSize); buf.reserve(finalSize); buf->reserve(finalSize); // reserve the size of the field while (!q.empty()) { vector<uint8_t> subField = q.front(); for (vector<uint8_t>::iterator it = subField.begin(); it != subField.end(); it++) { buf.push_back(*it); buf->push_back(*it); } q.pop_front(); } Loading Loading @@ -156,7 +156,7 @@ EncodedBuffer::strip(const PrivacySpec& spec) field.reserve(BUFFER_SIZE); while (it != mFdBuffer.end()) { status_t err = stripField(it, field, mPolicy, spec); status_t err = stripField(&it, &field, mPolicy, spec); if (err != NO_ERROR) return err; if (field.size() > BUFFER_SIZE) { // rotate to another chunk if buffer size exceeds mBuffers.push_back(field); Loading
cmds/incidentd/src/Privacy.cpp +2 −27 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ #include "Privacy.h" #include <stdlib.h> // DESTINATION enum value const uint8_t DEST_LOCAL = 0; const uint8_t DEST_EXPLICIT = 1; Loading @@ -25,33 +27,6 @@ const uint8_t DEST_AUTOMATIC = 2; const uint8_t TYPE_STRING = 9; const uint8_t TYPE_MESSAGE = 11; Privacy::Privacy(uint32_t field_id, uint8_t type, uint8_t dest) : field_id(field_id), type(type), children(NULL), dest(dest), patterns(NULL) { } Privacy::Privacy(uint32_t field_id, const Privacy** children) : field_id(field_id), type(TYPE_MESSAGE), children(children), dest(DEST_DEFAULT_VALUE), // this will be ignored patterns(NULL) { } Privacy::Privacy(uint32_t field_id, uint8_t dest, const char** patterns) : field_id(field_id), type(TYPE_STRING), children(NULL), dest(dest), patterns(patterns) { } bool Privacy::IsMessageType() const { return type == TYPE_MESSAGE; } Loading
cmds/incidentd/src/Privacy.h +1 −5 Original line number Diff line number Diff line Loading @@ -30,17 +30,13 @@ struct Privacy { uint32_t field_id; uint8_t type; // ignore parent's privacy flags if children are set, NULL-terminated const Privacy** children; Privacy** children; // the following fields are identitical to // frameworks/base/libs/incident/proto/android/privacy.proto uint8_t dest; const char** patterns; // only set when type is string Privacy(uint32_t field_id, uint8_t type, uint8_t dest); // generic constructor Privacy(uint32_t field_id, const Privacy** children); // used for message type Privacy(uint32_t field_id, uint8_t dest, const char** patterns); // used for string type bool IsMessageType() const; bool IsStringType() const; bool HasChildren() const; Loading
cmds/incidentd/src/Section.cpp +13 −7 Original line number Diff line number Diff line Loading @@ -97,13 +97,19 @@ static status_t wait_child(pid_t pid) { static const Privacy* get_privacy_of_section(int id) { if (id < 0) return NULL; int i=0; while (PRIVACY_POLICY_LIST[i] != NULL) { const Privacy* p = PRIVACY_POLICY_LIST[i]; if (p->field_id == (uint32_t)id) return p; if (p->field_id > (uint32_t)id) return NULL; i++; int l = 0; int r = PRIVACY_POLICY_COUNT - 1; while (l <= r) { int mid = (l + r) >> 1; const Privacy* p = PRIVACY_POLICY_LIST[mid]; if (p->field_id < (uint32_t)id) { l = mid + 1; } else if (p->field_id > (uint32_t)id) { r = mid - 1; } else { return p; } } return NULL; } Loading