liblzma: Don't create an empty Block in lzma_stream_buffer_encode().
authorLasse Collin <lasse.collin@tukaani.org>
Mon, 11 Apr 2011 10:59:50 +0000 (13:59 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Mon, 11 Apr 2011 10:59:50 +0000 (13:59 +0300)
Empty Block was created if the input buffer was empty.
Empty Block wastes a few bytes of space, but more importantly
it triggers a bug in XZ Utils 5.0.1 and older when trying
to decompress such a file. 5.0.1 and older consider such
files to be corrupt. I thought that no encoder creates empty
Blocks when releasing 5.0.2 but I was wrong.

src/liblzma/common/stream_buffer_encoder.c

index dd23c9a..2450ee2 100644 (file)
@@ -84,26 +84,32 @@ lzma_stream_buffer_encode(lzma_filter *filters, lzma_check check,
 
        out_pos += LZMA_STREAM_HEADER_SIZE;
 
-       // Block
+       // Encode a Block but only if there is at least one byte of input.
        lzma_block block = {
                .version = 0,
                .check = check,
                .filters = filters,
        };
 
-       return_if_error(lzma_block_buffer_encode(&block, allocator,
-                       in, in_size, out, &out_pos, out_size));
+       if (in_size > 0)
+               return_if_error(lzma_block_buffer_encode(&block, allocator,
+                               in, in_size, out, &out_pos, out_size));
 
        // Index
        {
-               // Create an Index with one Record.
+               // Create an Index. It will have one Record if there was
+               // at least one byte of input to encode. Otherwise the
+               // Index will be empty.
                lzma_index *i = lzma_index_init(allocator);
                if (i == NULL)
                        return LZMA_MEM_ERROR;
 
-               lzma_ret ret = lzma_index_append(i, allocator,
-                               lzma_block_unpadded_size(&block),
-                               block.uncompressed_size);
+               lzma_ret ret = LZMA_OK;
+
+               if (in_size > 0)
+                       ret = lzma_index_append(i, allocator,
+                                       lzma_block_unpadded_size(&block),
+                                       block.uncompressed_size);
 
                // If adding the Record was successful, encode the Index
                // and get its size which will be stored into Stream Footer.