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:
parent
3b22fc2c87
commit
d119927475
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue