liblzma: Don't create an empty Block in lzma_stream_buffer_encode().

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.
This commit is contained in:
Lasse Collin 2011-04-11 13:59:50 +03:00
parent 73f56fb87d
commit 2ee4edeffc
1 changed files with 13 additions and 7 deletions

View File

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