diff options
author | Yi Jin <jinyithu@google.com> | 2017-10-11 18:20:24 -0700 |
---|---|---|
committer | Yi Jin <jinyithu@google.com> | 2017-10-13 15:44:26 -0700 |
commit | 42711a0b4fffd0dc670ec7bc38cc7f954c60e530 (patch) | |
tree | 2e4b9a91caffb1098c823af806ee956a0ba207d2 /libs | |
parent | fcf52c6f5e2276c9cf2ca245757a2f0f4b1d7e4e (diff) |
Use ProtoOutputStream to strip Pii sensetive fields in incidentd
The in-place algorithm in ProtoOutputStream will have at most 2 copies
of possible nested message values incidentd is getting which makes it
more ram-efficient, and minimize allocations.
Bug: 65641021
Test: the units pass
Change-Id: Ic3fe99b7e27895bd613a129ba0f12ccfca4af317
Diffstat (limited to 'libs')
-rw-r--r-- | libs/protoutil/include/android/util/ProtoOutputStream.h | 14 | ||||
-rw-r--r-- | libs/protoutil/src/ProtoOutputStream.cpp | 48 |
2 files changed, 50 insertions, 12 deletions
diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h index 49ec169b3e5c..0f1ccedeaae2 100644 --- a/libs/protoutil/include/android/util/ProtoOutputStream.h +++ b/libs/protoutil/include/android/util/ProtoOutputStream.h @@ -37,7 +37,7 @@ namespace util { class ProtoOutputStream { public: - ProtoOutputStream(int fd); + ProtoOutputStream(); ~ProtoOutputStream(); /** @@ -60,13 +60,19 @@ public: void end(long long token); /** - * Flushes the protobuf data out. + * Flushes the protobuf data out to given fd. */ - bool flush(); + size_t size(); + EncodedBuffer::iterator data(); + bool flush(int fd); + + // Please don't use the following functions to dump protos unless you are sure about it. + void writeRawVarint(uint64_t varint); + void writeLengthDelimitedHeader(uint32_t id, size_t size); + void writeRawByte(uint8_t byte); private: EncodedBuffer mBuffer; - int mFd; size_t mCopyBegin; bool mCompact; int mDepth; diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index e9ca0dcb1093..15144ac2eb28 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -70,9 +70,8 @@ const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT; const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT; const uint64_t FIELD_COUNT_PACKED = 4ULL << FIELD_COUNT_SHIFT; -ProtoOutputStream::ProtoOutputStream(int fd) +ProtoOutputStream::ProtoOutputStream() :mBuffer(), - mFd(fd), mCopyBegin(0), mCompact(false), mDepth(0), @@ -483,6 +482,13 @@ ProtoOutputStream::compactSize(size_t rawSize) return true; } +size_t +ProtoOutputStream::size() +{ + compact(); + return mBuffer.size(); +} + static bool write_all(int fd, uint8_t const* buf, size_t size) { while (size > 0) { @@ -497,19 +503,47 @@ static bool write_all(int fd, uint8_t const* buf, size_t size) } bool -ProtoOutputStream::flush() +ProtoOutputStream::flush(int fd) { - if (mFd < 0) return false; + if (fd < 0) return false; if (!compact()) return false; EncodedBuffer::iterator it = mBuffer.begin(); while (it.readBuffer() != NULL) { - if (!write_all(mFd, it.readBuffer(), it.currentToRead())) return false; + if (!write_all(fd, it.readBuffer(), it.currentToRead())) return false; it.rp()->move(it.currentToRead()); } return true; } +EncodedBuffer::iterator +ProtoOutputStream::data() +{ + compact(); + return mBuffer.begin(); +} + +void +ProtoOutputStream::writeRawVarint(uint64_t varint) +{ + mBuffer.writeRawVarint64(varint); +} + +void +ProtoOutputStream::writeLengthDelimitedHeader(uint32_t id, size_t size) +{ + mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED); + // reserves 64 bits for length delimited fields, if first field is negative, compact it. + mBuffer.writeRawFixed32(size); + mBuffer.writeRawFixed32(size); +} + +void +ProtoOutputStream::writeRawByte(uint8_t byte) +{ + mBuffer.writeRawByte(byte); +} + // ========================================================================= // Private functions @@ -639,9 +673,7 @@ inline void ProtoOutputStream::writeUtf8StringImpl(uint32_t id, const char* val, size_t size) { if (val == NULL || size == 0) return; - mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED); - mBuffer.writeRawFixed32(size); - mBuffer.writeRawFixed32(size); + writeLengthDelimitedHeader(id, size); for (size_t i=0; i<size; i++) { mBuffer.writeRawByte((uint8_t)val[i]); } |