From 99e12af4e2b866c011fe0106cd1e0bfdcc8fe9c6 Mon Sep 17 00:00:00 2001 From: Lasse Collin Date: Wed, 23 Jan 2008 13:36:07 +0200 Subject: [PATCH] Fix Size of Header Metadata Block handling. Now lzma_metadata.header_metadata_size == LZMA_VLI_VALUE_UNKNOWN is not allowed at all. To indicate missing Header Metadata Block, header_metadata_size must be set to zero. This is what Metadata decoder does after this patch too. Note that other missing fields in lzma_metadata are still indicated with LZMA_VLI_VALUE_UNKNOWN. This isn't as illogical as it sounds at first, because missing Size of Header Metadata Block means that Header Metadata Block is not present in the Stream. With other Metadata fields, a missing field means only that the value is unknown. --- src/liblzma/common/info.c | 13 ++++--------- src/liblzma/common/metadata_decoder.c | 6 ++++++ src/liblzma/common/metadata_encoder.c | 11 +++++------ tests/test_info.c | 4 ++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/liblzma/common/info.c b/src/liblzma/common/info.c index b05bd031..ab7fc999 100644 --- a/src/liblzma/common/info.c +++ b/src/liblzma/common/info.c @@ -367,7 +367,7 @@ lzma_info_metadata_set(lzma_info *info, lzma_allocator *allocator, lzma_bool eat_index) { // Validate *metadata. - if (!lzma_vli_is_valid(metadata->header_metadata_size) + if (metadata->header_metadata_size > LZMA_VLI_VALUE_MAX || !lzma_vli_is_valid(metadata->total_size) || !lzma_vli_is_valid(metadata->uncompressed_size)) { if (eat_index) { @@ -403,15 +403,10 @@ lzma_info_metadata_set(lzma_info *info, lzma_allocator *allocator, } // Size of Header Metadata - if (!is_header_metadata) { - // If it is marked unknown in Metadata, it means that - // it's not present. - const lzma_vli size = metadata->header_metadata_size - != LZMA_VLI_VALUE_UNKNOWN - ? metadata->header_metadata_size : 0; + if (!is_header_metadata) return_if_error(lzma_info_size_set( - info, LZMA_INFO_HEADER_METADATA, size)); - } + info, LZMA_INFO_HEADER_METADATA, + metadata->header_metadata_size)); // Total Size if (metadata->total_size != LZMA_VLI_VALUE_UNKNOWN) diff --git a/src/liblzma/common/metadata_decoder.c b/src/liblzma/common/metadata_decoder.c index 5016af61..356a9e31 100644 --- a/src/liblzma/common/metadata_decoder.c +++ b/src/liblzma/common/metadata_decoder.c @@ -169,6 +169,12 @@ process(lzma_coder *coder, lzma_allocator *allocator) return LZMA_DATA_ERROR; --coder->todo_count; + } else { + // Zero indicates that Size of Header Metadata Block + // is not present. That is, after successful Metadata + // decoding, metadata->header_metadata_size is + // never LZMA_VLI_VALUE_UNKNOWN. + coder->metadata->header_metadata_size = 0; } coder->sequence = SEQ_TOTAL_SIZE; diff --git a/src/liblzma/common/metadata_encoder.c b/src/liblzma/common/metadata_encoder.c index 17587c5c..9f4a15b0 100644 --- a/src/liblzma/common/metadata_encoder.c +++ b/src/liblzma/common/metadata_encoder.c @@ -87,8 +87,7 @@ process(lzma_coder *coder) case SEQ_FLAGS: coder->buffer[coder->buffer_size] = 0; - if (coder->metadata.header_metadata_size - != LZMA_VLI_VALUE_UNKNOWN) + if (coder->metadata.header_metadata_size != 0) coder->buffer[coder->buffer_size] |= 0x01; if (coder->metadata.total_size != LZMA_VLI_VALUE_UNKNOWN) @@ -109,8 +108,7 @@ process(lzma_coder *coder) break; case SEQ_HEADER_METADATA_SIZE: - if (coder->metadata.header_metadata_size - != LZMA_VLI_VALUE_UNKNOWN) + if (coder->metadata.header_metadata_size != 0) write_vli(coder->metadata.header_metadata_size); coder->sequence = SEQ_TOTAL_SIZE; @@ -373,13 +371,14 @@ lzma_metadata_size(const lzma_metadata *metadata) lzma_vli size = 1; // Metadata Flags // Validate header_metadata_size, total_size, and uncompressed_size. - if (!lzma_vli_is_valid(metadata->header_metadata_size) + if (metadata->header_metadata_size > LZMA_VLI_VALUE_MAX || !lzma_vli_is_valid(metadata->total_size) + || metadata->total_size == 0 || !lzma_vli_is_valid(metadata->uncompressed_size)) return 0; // Add the sizes of these three fields. - if (metadata->header_metadata_size != LZMA_VLI_VALUE_UNKNOWN) + if (metadata->header_metadata_size != 0) size += lzma_vli_size(metadata->header_metadata_size); if (metadata->total_size != LZMA_VLI_VALUE_UNKNOWN) diff --git a/tests/test_info.c b/tests/test_info.c index c073fafe..0de95431 100644 --- a/tests/test_info.c +++ b/tests/test_info.c @@ -527,7 +527,7 @@ test6(void) // still present in Footer. reset(); metadata = my_metadata; - metadata.header_metadata_size = LZMA_VLI_VALUE_UNKNOWN; + metadata.header_metadata_size = 0; expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA, 0) == LZMA_OK); expect(lzma_info_metadata_set(info, NULL, &metadata, true, false) @@ -539,7 +539,7 @@ test6(void) // from Footer. reset(); metadata = my_metadata; - metadata.header_metadata_size = LZMA_VLI_VALUE_UNKNOWN; + metadata.header_metadata_size = 0; expect(lzma_info_metadata_set(info, NULL, &my_metadata, true, false) == LZMA_OK); expect(lzma_info_size_set(info, LZMA_INFO_HEADER_METADATA,