Index: src/xz/list.c |
=================================================================== |
--- src/xz/list.c (revision 233270) |
+++ src/xz/list.c (working copy) |
@@ -203,6 +203,20 @@ |
goto error; |
} |
+ // Check that the Stream Footer doesn't specify something |
+ // that we don't support. This can only happen if the xz |
+ // version is older than liblzma and liblzma supports |
+ // something new. |
+ // |
+ // It is enough to check Stream Footer. Stream Header must |
+ // match when it is compared against Stream Footer with |
+ // lzma_stream_flags_compare(). |
+ if (footer_flags.version != 0) { |
+ message_error("%s: %s", pair->src_name, |
+ message_strm(LZMA_OPTIONS_ERROR)); |
+ goto error; |
+ } |
+ |
// Check that the size of the Index field looks sane. |
lzma_vli index_size = footer_flags.backward_size; |
if ((lzma_vli)(pos) < index_size + LZMA_STREAM_HEADER_SIZE) { |
@@ -429,8 +443,20 @@ |
switch (lzma_block_compressed_size(&block, |
iter->block.unpadded_size)) { |
case LZMA_OK: |
- break; |
+ // Validate also block.uncompressed_size if it is present. |
+ // If it isn't present, there's no need to set it since |
+ // we aren't going to actually decompress the Block; if |
+ // we were decompressing, then we should set it so that |
+ // the Block decoder could validate the Uncompressed Size |
+ // that was stored in the Index. |
+ if (block.uncompressed_size == LZMA_VLI_UNKNOWN |
+ || block.uncompressed_size |
+ == iter->block.uncompressed_size) |
+ break; |
+ // If the above fails, the file is corrupt so |
+ // LZMA_DATA_ERROR is a good error code. |
+ |
case LZMA_DATA_ERROR: |
// Free the memory allocated by lzma_block_header_decode(). |
for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i) |