From 707263e428bf711a19e55a48581c3d79c5a6f62f Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Fri, 9 Aug 2024 10:47:08 -0700 Subject: [res] Zero big buffer memory on backing up When a memory chunk gets returned into BigBuffer, it may have some data written already. BigBuffer is supposed to give out zeroed memory, so BackUp() needs to zero it as well Bug: 336758568 Bug: 342579978 Test: unit test + bundletool on the attached aab Flag: EXEMPT bugfix Change-Id: I8ecd60e84dbe16570a92d82370d1633af72599c8 --- libs/androidfw/BigBuffer.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'libs/androidfw/BigBuffer.cpp') diff --git a/libs/androidfw/BigBuffer.cpp b/libs/androidfw/BigBuffer.cpp index bedfc49a1b0d..43b56c32fb79 100644 --- a/libs/androidfw/BigBuffer.cpp +++ b/libs/androidfw/BigBuffer.cpp @@ -17,8 +17,8 @@ #include #include +#include #include -#include #include "android-base/logging.h" @@ -78,10 +78,27 @@ void* BigBuffer::NextBlock(size_t* out_size) { std::string BigBuffer::to_string() const { std::string result; + result.reserve(size_); for (const Block& block : blocks_) { result.append(block.buffer.get(), block.buffer.get() + block.size); } return result; } +void BigBuffer::AppendBuffer(BigBuffer&& buffer) { + std::move(buffer.blocks_.begin(), buffer.blocks_.end(), std::back_inserter(blocks_)); + size_ += buffer.size_; + buffer.blocks_.clear(); + buffer.size_ = 0; +} + +void BigBuffer::BackUp(size_t count) { + Block& block = blocks_.back(); + block.size -= count; + size_ -= count; + // BigBuffer is supposed to always give zeroed memory, but backing up usually means + // something has been already written into the block. Erase it. + std::fill_n(block.buffer.get() + block.size, count, 0); +} + } // namespace android -- cgit v1.2.3-59-g8ed1b