Coverage Report

Created: 2025-07-23 08:18

/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
}