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");