Make the raw value of the Check field available to applications
via lzma_block structure. This changes ABI but not doesn't break API.
This commit is contained in:
parent
b4f5c81409
commit
083c23c680
|
@ -207,6 +207,23 @@ typedef struct {
|
||||||
*/
|
*/
|
||||||
lzma_filter *filters;
|
lzma_filter *filters;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Raw value stored in the Check field
|
||||||
|
*
|
||||||
|
* After successful coding, the first lzma_check_size(check) bytes
|
||||||
|
* of this array contain the raw value stored in the Check field.
|
||||||
|
*
|
||||||
|
* Note that CRC32 and CRC64 are stored in little endian byte order.
|
||||||
|
* Take it into account if you display the Check values to the user.
|
||||||
|
*
|
||||||
|
* Written by:
|
||||||
|
* - lzma_block_encoder()
|
||||||
|
* - lzma_block_decoder()
|
||||||
|
* - lzma_block_buffer_encode()
|
||||||
|
* - lzma_block_buffer_decode()
|
||||||
|
*/
|
||||||
|
uint8_t raw_check[64];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reserved space to allow possible future extensions without
|
* Reserved space to allow possible future extensions without
|
||||||
* breaking the ABI. You should not touch these, because the names
|
* breaking the ABI. You should not touch these, because the names
|
||||||
|
|
|
@ -290,6 +290,7 @@ lzma_block_buffer_encode(lzma_block *block, lzma_allocator *allocator,
|
||||||
lzma_check_update(&check, block->check, in, in_size);
|
lzma_check_update(&check, block->check, in, in_size);
|
||||||
lzma_check_finish(&check, block->check);
|
lzma_check_finish(&check, block->check);
|
||||||
|
|
||||||
|
memcpy(block->raw_check, check.buffer.u8, check_size);
|
||||||
memcpy(out + *out_pos, check.buffer.u8, check_size);
|
memcpy(out + *out_pos, check.buffer.u8, check_size);
|
||||||
*out_pos += check_size;
|
*out_pos += check_size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,26 +146,22 @@ block_decode(lzma_coder *coder, lzma_allocator *allocator,
|
||||||
// Fall through
|
// Fall through
|
||||||
|
|
||||||
case SEQ_CHECK: {
|
case SEQ_CHECK: {
|
||||||
const bool chksup = lzma_check_is_supported(
|
const size_t check_size = lzma_check_size(coder->block->check);
|
||||||
coder->block->check);
|
lzma_bufcpy(in, in_pos, in_size, coder->block->raw_check,
|
||||||
|
&coder->check_pos, check_size);
|
||||||
while (*in_pos < in_size) {
|
if (coder->check_pos < check_size)
|
||||||
// coder->check.buffer[] may be uninitialized when
|
|
||||||
// the Check ID is not supported.
|
|
||||||
if (chksup && coder->check.buffer.u8[coder->check_pos]
|
|
||||||
!= in[*in_pos]) {
|
|
||||||
++*in_pos;
|
|
||||||
return LZMA_DATA_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
++*in_pos;
|
|
||||||
|
|
||||||
if (++coder->check_pos == lzma_check_size(
|
|
||||||
coder->block->check))
|
|
||||||
return LZMA_STREAM_END;
|
|
||||||
}
|
|
||||||
|
|
||||||
return LZMA_OK;
|
return LZMA_OK;
|
||||||
|
|
||||||
|
// Validate the Check only if we support it.
|
||||||
|
// coder->check.buffer may be uninitialized
|
||||||
|
// when the Check ID is not supported.
|
||||||
|
if (lzma_check_is_supported(coder->block->check)
|
||||||
|
&& memcmp(coder->block->raw_check,
|
||||||
|
coder->check.buffer.u8,
|
||||||
|
check_size) != 0)
|
||||||
|
return LZMA_DATA_ERROR;
|
||||||
|
|
||||||
|
return LZMA_STREAM_END;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,18 +117,15 @@ block_encode(lzma_coder *coder, lzma_allocator *allocator,
|
||||||
// Fall through
|
// Fall through
|
||||||
|
|
||||||
case SEQ_CHECK: {
|
case SEQ_CHECK: {
|
||||||
const uint32_t check_size
|
const size_t check_size = lzma_check_size(coder->block->check);
|
||||||
= lzma_check_size(coder->block->check);
|
lzma_bufcpy(coder->check.buffer.u8, &coder->pos, check_size,
|
||||||
|
out, out_pos, out_size);
|
||||||
while (*out_pos < out_size) {
|
if (coder->pos < check_size)
|
||||||
out[*out_pos] = coder->check.buffer.u8[coder->pos];
|
|
||||||
++*out_pos;
|
|
||||||
|
|
||||||
if (++coder->pos == check_size)
|
|
||||||
return LZMA_STREAM_END;
|
|
||||||
}
|
|
||||||
|
|
||||||
return LZMA_OK;
|
return LZMA_OK;
|
||||||
|
|
||||||
|
memcpy(coder->block->raw_check, coder->check.buffer.u8,
|
||||||
|
check_size);
|
||||||
|
return LZMA_STREAM_END;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue