Index: xz/src/liblzma/common/block_util.c |
=================================================================== |
--- xz/src/liblzma/common/block_util.c (revision 0) |
+++ xz/src/liblzma/common/block_util.c (revision 0) |
@@ -0,0 +1,90 @@ |
+/////////////////////////////////////////////////////////////////////////////// |
+// |
+/// \file block_header.c |
+/// \brief Utility functions to handle lzma_block |
+// |
+// Author: Lasse Collin |
+// |
+// This file has been put into the public domain. |
+// You can do whatever you want with this file. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+#include "common.h" |
+#include "index.h" |
+ |
+ |
+extern LZMA_API(lzma_ret) |
+lzma_block_compressed_size(lzma_block *block, lzma_vli unpadded_size) |
+{ |
+ // Validate everything but Uncompressed Size and filters. |
+ if (lzma_block_unpadded_size(block) == 0) |
+ return LZMA_PROG_ERROR; |
+ |
+ const uint32_t container_size = block->header_size |
+ + lzma_check_size(block->check); |
+ |
+ // Validate that Compressed Size will be greater than zero. |
+ if (unpadded_size <= container_size) |
+ return LZMA_DATA_ERROR; |
+ |
+ // Calculate what Compressed Size is supposed to be. |
+ // If Compressed Size was present in Block Header, |
+ // compare that the new value matches it. |
+ const lzma_vli compressed_size = unpadded_size - container_size; |
+ if (block->compressed_size != LZMA_VLI_UNKNOWN |
+ && block->compressed_size != compressed_size) |
+ return LZMA_DATA_ERROR; |
+ |
+ block->compressed_size = compressed_size; |
+ |
+ return LZMA_OK; |
+} |
+ |
+ |
+extern LZMA_API(lzma_vli) |
+lzma_block_unpadded_size(const lzma_block *block) |
+{ |
+ // Validate the values that we are interested in i.e. all but |
+ // Uncompressed Size and the filters. |
+ // |
+ // NOTE: This function is used for validation too, so it is |
+ // essential that these checks are always done even if |
+ // Compressed Size is unknown. |
+ if (block == NULL || block->version != 0 |
+ || block->header_size < LZMA_BLOCK_HEADER_SIZE_MIN |
+ || block->header_size > LZMA_BLOCK_HEADER_SIZE_MAX |
+ || (block->header_size & 3) |
+ || !lzma_vli_is_valid(block->compressed_size) |
+ || block->compressed_size == 0 |
+ || (unsigned int)(block->check) > LZMA_CHECK_ID_MAX) |
+ return 0; |
+ |
+ // If Compressed Size is unknown, return that we cannot know |
+ // size of the Block either. |
+ if (block->compressed_size == LZMA_VLI_UNKNOWN) |
+ return LZMA_VLI_UNKNOWN; |
+ |
+ // Calculate Unpadded Size and validate it. |
+ const lzma_vli unpadded_size = block->compressed_size |
+ + block->header_size |
+ + lzma_check_size(block->check); |
+ |
+ assert(unpadded_size >= UNPADDED_SIZE_MIN); |
+ if (unpadded_size > UNPADDED_SIZE_MAX) |
+ return 0; |
+ |
+ return unpadded_size; |
+} |
+ |
+ |
+extern LZMA_API(lzma_vli) |
+lzma_block_total_size(const lzma_block *block) |
+{ |
+ lzma_vli unpadded_size = lzma_block_unpadded_size(block); |
+ |
+ if (unpadded_size != LZMA_VLI_UNKNOWN) |
+ unpadded_size = vli_ceil4(unpadded_size); |
+ |
+ return unpadded_size; |
+} |
Property changes on: xz/src/liblzma/common/block_util.c |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |