diff options
Diffstat (limited to 'tools/aapt2/format/Container.cpp')
-rw-r--r-- | tools/aapt2/format/Container.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/tools/aapt2/format/Container.cpp b/tools/aapt2/format/Container.cpp index f1890488276c..9cef7b3d2ce3 100644 --- a/tools/aapt2/format/Container.cpp +++ b/tools/aapt2/format/Container.cpp @@ -30,6 +30,7 @@ namespace aapt { constexpr const static uint32_t kContainerFormatMagic = 0x54504141u; constexpr const static uint32_t kContainerFormatVersion = 1u; +constexpr const static size_t kPaddingAlignment = 4u; ContainerWriter::ContainerWriter(ZeroCopyOutputStream* out, size_t entry_count) : out_(out), total_entry_count_(entry_count), current_entry_count_(0u) { @@ -49,11 +50,17 @@ ContainerWriter::ContainerWriter(ZeroCopyOutputStream* out, size_t entry_count) } } -inline static void WritePadding(int padding, CodedOutputStream* out) { - if (padding < 4) { - const uint32_t zero = 0u; - out->WriteRaw(&zero, padding); - } +inline static size_t CalculatePaddingForAlignment(size_t size) { + size_t overage = size % kPaddingAlignment; + return overage == 0 ? 0 : kPaddingAlignment - overage; +} + +inline static void WritePadding(size_t padding, CodedOutputStream* out) { + CHECK(padding < kPaddingAlignment); + const uint32_t zero = 0u; + static_assert(sizeof(zero) >= kPaddingAlignment, "Not enough source bytes for padding"); + + out->WriteRaw(&zero, padding); } bool ContainerWriter::AddResTableEntry(const pb::ResourceTable& table) { @@ -70,7 +77,7 @@ bool ContainerWriter::AddResTableEntry(const pb::ResourceTable& table) { // Write the aligned size. const ::google::protobuf::uint64 size = table.ByteSize(); - const int padding = 4 - (size % 4); + const int padding = CalculatePaddingForAlignment(size); coded_out.WriteLittleEndian64(size); // Write the table. @@ -103,9 +110,9 @@ bool ContainerWriter::AddResFileEntry(const pb::internal::CompiledFile& file, // Write the aligned size. const ::google::protobuf::uint32 header_size = file.ByteSize(); - const int header_padding = 4 - (header_size % 4); + const int header_padding = CalculatePaddingForAlignment(header_size); const ::google::protobuf::uint64 data_size = in->TotalSize(); - const int data_padding = 4 - (data_size % 4); + const int data_padding = CalculatePaddingForAlignment(data_size); coded_out.WriteLittleEndian64(kResFileEntryHeaderSize + header_size + header_padding + data_size + data_padding); |