liblzma: Check that the first byte of range encoded data is 0x00.

It is just to be more pedantic and thus perhaps catch broken
files slightly earlier.
This commit is contained in:
Lasse Collin 2012-06-28 10:47:49 +03:00
parent eccd8017ff
commit 1403707fc6
2 changed files with 15 additions and 5 deletions

View File

@ -289,8 +289,12 @@ lzma_decode(lzma_coder *restrict coder, lzma_dict *restrict dictptr,
// Initialization //
////////////////////
if (!rc_read_init(&coder->rc, in, in_pos, in_size))
return LZMA_OK;
{
const lzma_ret ret = rc_read_init(
&coder->rc, in, in_pos, in_size);
if (ret != LZMA_STREAM_END)
return ret;
}
///////////////
// Variables //

View File

@ -25,20 +25,26 @@ typedef struct {
/// Reads the first five bytes to initialize the range decoder.
static inline bool
static inline lzma_ret
rc_read_init(lzma_range_decoder *rc, const uint8_t *restrict in,
size_t *restrict in_pos, size_t in_size)
{
while (rc->init_bytes_left > 0) {
if (*in_pos == in_size)
return false;
return LZMA_OK;
// The first byte is always 0x00. It could have been omitted
// in LZMA2 but it wasn't, so one byte is wasted in every
// LZMA2 chunk.
if (rc->init_bytes_left == 5 && in[*in_pos] != 0x00)
return LZMA_DATA_ERROR;
rc->code = (rc->code << 8) | in[*in_pos];
++*in_pos;
--rc->init_bytes_left;
}
return true;
return LZMA_STREAM_END;
}