/src/xz/src/liblzma/common/block_util.c
Line | Count | Source (jump to first uncovered line) |
1 | | // SPDX-License-Identifier: 0BSD |
2 | | |
3 | | /////////////////////////////////////////////////////////////////////////////// |
4 | | // |
5 | | /// \file block_util.c |
6 | | /// \brief Utility functions to handle lzma_block |
7 | | // |
8 | | // Author: Lasse Collin |
9 | | // |
10 | | /////////////////////////////////////////////////////////////////////////////// |
11 | | |
12 | | #include "common.h" |
13 | | #include "index.h" |
14 | | |
15 | | |
16 | | extern LZMA_API(lzma_ret) |
17 | | lzma_block_compressed_size(lzma_block *block, lzma_vli unpadded_size) |
18 | 0 | { |
19 | | // Validate everything but Uncompressed Size and filters. |
20 | 0 | if (lzma_block_unpadded_size(block) == 0) |
21 | 0 | return LZMA_PROG_ERROR; |
22 | | |
23 | 0 | const uint32_t container_size = block->header_size |
24 | 0 | + lzma_check_size(block->check); |
25 | | |
26 | | // Validate that Compressed Size will be greater than zero. |
27 | 0 | if (unpadded_size <= container_size) |
28 | 0 | return LZMA_DATA_ERROR; |
29 | | |
30 | | // Calculate what Compressed Size is supposed to be. |
31 | | // If Compressed Size was present in Block Header, |
32 | | // compare that the new value matches it. |
33 | 0 | const lzma_vli compressed_size = unpadded_size - container_size; |
34 | 0 | if (block->compressed_size != LZMA_VLI_UNKNOWN |
35 | 0 | && block->compressed_size != compressed_size) |
36 | 0 | return LZMA_DATA_ERROR; |
37 | | |
38 | 0 | block->compressed_size = compressed_size; |
39 | |
|
40 | 0 | return LZMA_OK; |
41 | 0 | } |
42 | | |
43 | | |
44 | | extern LZMA_API(lzma_vli) |
45 | | lzma_block_unpadded_size(const lzma_block *block) |
46 | 12.3k | { |
47 | | // Validate the values that we are interested in i.e. all but |
48 | | // Uncompressed Size and the filters. |
49 | | // |
50 | | // NOTE: This function is used for validation too, so it is |
51 | | // essential that these checks are always done even if |
52 | | // Compressed Size is unknown. |
53 | 12.3k | if (block == NULL || block->version > 1 |
54 | 12.3k | || block->header_size < LZMA_BLOCK_HEADER_SIZE_MIN |
55 | 12.3k | || block->header_size > LZMA_BLOCK_HEADER_SIZE_MAX |
56 | 12.3k | || (block->header_size & 3) |
57 | 12.3k | || !lzma_vli_is_valid(block->compressed_size) |
58 | 12.3k | || block->compressed_size == 0 |
59 | 12.3k | || (unsigned int)(block->check) > LZMA_CHECK_ID_MAX) |
60 | 30 | return 0; |
61 | | |
62 | | // If Compressed Size is unknown, return that we cannot know |
63 | | // size of the Block either. |
64 | 12.3k | if (block->compressed_size == LZMA_VLI_UNKNOWN) |
65 | 9.73k | return LZMA_VLI_UNKNOWN; |
66 | | |
67 | | // Calculate Unpadded Size and validate it. |
68 | 2.58k | const lzma_vli unpadded_size = block->compressed_size |
69 | 2.58k | + block->header_size |
70 | 2.58k | + lzma_check_size(block->check); |
71 | | |
72 | 2.58k | assert(unpadded_size >= UNPADDED_SIZE_MIN); |
73 | 2.58k | if (unpadded_size > UNPADDED_SIZE_MAX) |
74 | 0 | return 0; |
75 | | |
76 | 2.58k | return unpadded_size; |
77 | 2.58k | } |
78 | | |
79 | | |
80 | | extern LZMA_API(lzma_vli) |
81 | | lzma_block_total_size(const lzma_block *block) |
82 | 0 | { |
83 | 0 | lzma_vli unpadded_size = lzma_block_unpadded_size(block); |
84 | |
|
85 | 0 | if (unpadded_size != LZMA_VLI_UNKNOWN) |
86 | 0 | unpadded_size = vli_ceil4(unpadded_size); |
87 | |
|
88 | 0 | return unpadded_size; |
89 | 0 | } |