If there are zero bytes to compress, TransientBytes::CompressOut should return Z_NO_COMPRESSION immediately. RELNOTES: -- MOS_MIGRATED_REVID=131566325
diff --git a/src/tools/singlejar/transient_bytes.h b/src/tools/singlejar/transient_bytes.h index f2f1ba2..18f359e 100644 --- a/src/tools/singlejar/transient_bytes.h +++ b/src/tools/singlejar/transient_bytes.h
@@ -145,11 +145,16 @@ // Z_NO_COMPRESSION otherwise. uint16_t CompressOut(uint8_t *buffer, uint32_t *checksum, uint64_t *bytes_written) { + *checksum = 0; + uint64_t to_compress = data_size(); + if (to_compress == 0) { + *bytes_written = 0; + return Z_NO_COMPRESSION; + } + Deflater deflater; deflater.next_out = buffer; - *checksum = 0; uint16_t compression_method = Z_DEFLATED; - uint64_t to_compress = data_size(); // Feed data blocks to the deflater one by one, but break if the compressed // size exceeds the original size.
diff --git a/src/tools/singlejar/transient_bytes_test.cc b/src/tools/singlejar/transient_bytes_test.cc index cdb07dd..a63305e 100644 --- a/src/tools/singlejar/transient_bytes_test.cc +++ b/src/tools/singlejar/transient_bytes_test.cc
@@ -311,6 +311,20 @@ ASSERT_EQ(0xE8B7BE43, crc32); } +// Verify CompressOut: if there are zero bytes in the buffer, just store. +TEST_F(TransientBytesTest, CompressZero) { + transient_bytes_->Append(""); + uint8_t buffer[400] = {0xfe, 0xfb}; + uint32_t crc32 = 0; + uint64_t bytes_written; + uint16_t rc = transient_bytes_->CompressOut(buffer, &crc32, &bytes_written); + ASSERT_EQ(Z_NO_COMPRESSION, rc); + ASSERT_EQ(0, bytes_written); + ASSERT_EQ(0xfe, buffer[0]); + ASSERT_EQ(0xfb, buffer[1]); + ASSERT_EQ(0, crc32); +} + // Verify CopyOut. TEST_F(TransientBytesTest, CopyOut) { transient_bytes_->Append("a");