Rizin
unix-like reverse engineering framework and cli tools
block_decoder.h File Reference

Decodes .xz Blocks. More...

#include "common.h"

Go to the source code of this file.

Functions

lzma_ret lzma_block_decoder_init (lzma_next_coder *next, const lzma_allocator *allocator, lzma_block *block)
 

Detailed Description

Decodes .xz Blocks.

Definition in file block_decoder.h.

Function Documentation

◆ lzma_block_decoder_init()

lzma_ret lzma_block_decoder_init ( lzma_next_coder next,
const lzma_allocator allocator,
lzma_block block 
)

Definition at line 192 of file block_decoder.c.

194 {
196 
197  // Validate the options. lzma_block_unpadded_size() does that for us
198  // except for Uncompressed Size and filters. Filters are validated
199  // by the raw decoder.
200  if (lzma_block_unpadded_size(block) == 0
202  return LZMA_PROG_ERROR;
203 
204  // Allocate *next->coder if needed.
205  lzma_block_coder *coder = next->coder;
206  if (coder == NULL) {
207  coder = lzma_alloc(sizeof(lzma_block_coder), allocator);
208  if (coder == NULL)
209  return LZMA_MEM_ERROR;
210 
211  next->coder = coder;
212  next->code = &block_decode;
213  next->end = &block_decoder_end;
214  coder->next = LZMA_NEXT_CODER_INIT;
215  }
216 
217  // Basic initializations
218  coder->sequence = SEQ_CODE;
219  coder->block = block;
220  coder->compressed_size = 0;
221  coder->uncompressed_size = 0;
222 
223  // If Compressed Size is not known, we calculate the maximum allowed
224  // value so that encoded size of the Block (including Block Padding)
225  // is still a valid VLI and a multiple of four.
226  coder->compressed_limit
228  ? (LZMA_VLI_MAX & ~LZMA_VLI_C(3))
229  - block->header_size
230  - lzma_check_size(block->check)
231  : block->compressed_size;
232 
233  // Initialize the check. It's caller's problem if the Check ID is not
234  // supported, and the Block decoder cannot verify the Check field.
235  // Caller can test lzma_check_is_supported(block->check).
236  coder->check_pos = 0;
237  lzma_check_init(&coder->check, block->check);
238 
239  coder->ignore_check = block->version >= 1
240  ? block->ignore_check : false;
241 
242  // Initialize the filter chain.
243  return lzma_raw_decoder_init(&coder->next, allocator,
244  block->filters);
245 }
const lzma_allocator * allocator
Definition: block.h:377
static void block_decoder_end(void *coder_ptr, const lzma_allocator *allocator)
lzma_ret lzma_block_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, lzma_block *block)
static lzma_ret block_decode(void *coder_ptr, const lzma_allocator *allocator, const uint8_t *restrict in, size_t *restrict in_pos, size_t in_size, uint8_t *restrict out, size_t *restrict out_pos, size_t out_size, lzma_action action)
Definition: block_decoder.c:77
void lzma_check_init(lzma_check_state *check, lzma_check type)
Initialize *check depending on type.
Definition: check.c:84
#define NULL
Definition: cris-opc.c:27
lzma_ret lzma_raw_decoder_init(lzma_next_coder *next, const lzma_allocator *allocator, const lzma_filter *options)
lzma_check_state check
Check of the uncompressed data.
Definition: block_decoder.c:47
size_t check_pos
Position when reading the Check field.
Definition: block_decoder.c:44
enum lzma_block_coder::@643 sequence
lzma_next_coder next
The filters in the chain; initialized with lzma_raw_decoder_init().
Definition: block_decoder.c:26
bool ignore_check
True if the integrity check won't be calculated and verified.
Definition: block_decoder.c:50
lzma_block * block
Definition: block_decoder.c:30
lzma_vli uncompressed_size
Uncompressed Size calculated while decoding.
Definition: block_decoder.c:36
lzma_vli compressed_size
Compressed Size calculated while decoding.
Definition: block_decoder.c:33
lzma_vli compressed_limit
Definition: block_decoder.c:41
lzma_vli uncompressed_size
Uncompressed Size in bytes.
Definition: block.h:172
lzma_bool ignore_check
A flag to Block decoder to not verify the Check field.
Definition: block.h:261
lzma_filter * filters
Array of filters.
Definition: block.h:200
uint32_t header_size
Size of the Block Header field.
Definition: block.h:72
lzma_check check
Type of integrity Check.
Definition: block.h:93
lzma_vli compressed_size
Size of the Compressed Data in bytes.
Definition: block.h:148
uint32_t version
Block format version.
Definition: block.h:52
lzma_code_function code
Pointer to function to do the actual coding.
Definition: common.h:150
void * coder
Pointer to coder-specific data.
Definition: common.h:137
lzma_end_function end
Definition: common.h:155
#define LZMA_NEXT_CODER_INIT
Macro to initialize lzma_next_coder structure.
Definition: common.h:180
#define lzma_next_coder_init(func, next, allocator)
Definition: common.h:291
void * lzma_alloc(size_t size, const lzma_allocator *allocator) lzma_attribute((__malloc__)) lzma_attr_alloc_size(1)
Allocates memory.
#define LZMA_VLI_C(n)
VLI constant suffix.
Definition: vli.h:49
#define lzma_vli_is_valid(vli)
Validate a variable-length integer.
Definition: vli.h:75
#define LZMA_VLI_UNKNOWN
VLI value to denote that the value is unknown.
Definition: vli.h:39
#define LZMA_VLI_MAX
Maximum supported value of a variable-length integer.
Definition: vli.h:34
@ LZMA_PROG_ERROR
Programming error.
Definition: base.h:218
@ LZMA_MEM_ERROR
Cannot allocate memory.
Definition: base.h:128

References allocator, lzma_block_coder::block, block_decode(), block_decoder_end(), lzma_block::check, lzma_block_coder::check, lzma_block_coder::check_pos, lzma_next_coder_s::code, lzma_next_coder_s::coder, lzma_block_coder::compressed_limit, lzma_block::compressed_size, lzma_block_coder::compressed_size, lzma_next_coder_s::end, lzma_block::filters, lzma_block::header_size, lzma_block::ignore_check, lzma_block_coder::ignore_check, lzma_alloc(), lzma_check_init(), LZMA_MEM_ERROR, LZMA_NEXT_CODER_INIT, lzma_next_coder_init, LZMA_PROG_ERROR, lzma_raw_decoder_init(), LZMA_VLI_C, lzma_vli_is_valid, LZMA_VLI_MAX, LZMA_VLI_UNKNOWN, lzma_block_coder::next, NULL, lzma_block_coder::sequence, lzma_block::uncompressed_size, lzma_block_coder::uncompressed_size, and lzma_block::version.

Referenced by LZMA_API(), and stream_decode().