Path: blob/master/Utilities/cmliblzma/liblzma/common/block_util.c
3153 views
// SPDX-License-Identifier: 0BSD12///////////////////////////////////////////////////////////////////////////////3//4/// \file block_util.c5/// \brief Utility functions to handle lzma_block6//7// Author: Lasse Collin8//9///////////////////////////////////////////////////////////////////////////////1011#include "common.h"12#include "index.h"131415extern LZMA_API(lzma_ret)16lzma_block_compressed_size(lzma_block *block, lzma_vli unpadded_size)17{18// Validate everything but Uncompressed Size and filters.19if (lzma_block_unpadded_size(block) == 0)20return LZMA_PROG_ERROR;2122const uint32_t container_size = block->header_size23+ lzma_check_size(block->check);2425// Validate that Compressed Size will be greater than zero.26if (unpadded_size <= container_size)27return LZMA_DATA_ERROR;2829// Calculate what Compressed Size is supposed to be.30// If Compressed Size was present in Block Header,31// compare that the new value matches it.32const lzma_vli compressed_size = unpadded_size - container_size;33if (block->compressed_size != LZMA_VLI_UNKNOWN34&& block->compressed_size != compressed_size)35return LZMA_DATA_ERROR;3637block->compressed_size = compressed_size;3839return LZMA_OK;40}414243extern LZMA_API(lzma_vli)44lzma_block_unpadded_size(const lzma_block *block)45{46// Validate the values that we are interested in i.e. all but47// Uncompressed Size and the filters.48//49// NOTE: This function is used for validation too, so it is50// essential that these checks are always done even if51// Compressed Size is unknown.52if (block == NULL || block->version > 153|| block->header_size < LZMA_BLOCK_HEADER_SIZE_MIN54|| block->header_size > LZMA_BLOCK_HEADER_SIZE_MAX55|| (block->header_size & 3)56|| !lzma_vli_is_valid(block->compressed_size)57|| block->compressed_size == 058|| (unsigned int)(block->check) > LZMA_CHECK_ID_MAX)59return 0;6061// If Compressed Size is unknown, return that we cannot know62// size of the Block either.63if (block->compressed_size == LZMA_VLI_UNKNOWN)64return LZMA_VLI_UNKNOWN;6566// Calculate Unpadded Size and validate it.67const lzma_vli unpadded_size = block->compressed_size68+ block->header_size69+ lzma_check_size(block->check);7071assert(unpadded_size >= UNPADDED_SIZE_MIN);72if (unpadded_size > UNPADDED_SIZE_MAX)73return 0;7475return unpadded_size;76}777879extern LZMA_API(lzma_vli)80lzma_block_total_size(const lzma_block *block)81{82lzma_vli unpadded_size = lzma_block_unpadded_size(block);8384if (unpadded_size != LZMA_VLI_UNKNOWN)85unpadded_size = vli_ceil4(unpadded_size);8687return unpadded_size;88}899091