]> granicus.if.org Git - xz/commitdiff
xz: Validate Uncompressed Size from Block Header in list.c.
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 23 Jun 2013 14:36:47 +0000 (17:36 +0300)
committerLasse Collin <lasse.collin@tukaani.org>
Sun, 23 Jun 2013 14:36:47 +0000 (17:36 +0300)
This affects only "xz -lvv". Normal decompression with xz
already detected if Block Header and Index had mismatched
Uncompressed Size fields. So this just makes "xz -lvv"
show such files as corrupt instead of showing the
Uncompressed Size from Index.

src/xz/list.c

index a9e0adb9301604f83bba5071565286c443743db2..13abd8f7abb9a95319565d48c76703e15e7cebc7 100644 (file)
@@ -456,7 +456,19 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
        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().