diff options
author | Lasse Collin <lasse.collin@tukaani.org> | 2012-06-28 10:47:49 +0300 |
---|---|---|
committer | Lasse Collin <lasse.collin@tukaani.org> | 2012-06-28 10:47:49 +0300 |
commit | 1403707fc64a70976aebe66f8d9a9bd12f73a2c5 (patch) | |
tree | c86756ed5ffbad7da56f39c793e3f19b728a5b77 /src/liblzma | |
parent | Update NEWS from 5.0.4. (diff) | |
download | xz-1403707fc64a70976aebe66f8d9a9bd12f73a2c5.tar.xz |
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.
Diffstat (limited to 'src/liblzma')
-rw-r--r-- | src/liblzma/lzma/lzma_decoder.c | 8 | ||||
-rw-r--r-- | src/liblzma/rangecoder/range_decoder.h | 12 |
2 files changed, 15 insertions, 5 deletions
diff --git a/src/liblzma/lzma/lzma_decoder.c b/src/liblzma/lzma/lzma_decoder.c index d61b7dee..b6f1b6a1 100644 --- a/src/liblzma/lzma/lzma_decoder.c +++ b/src/liblzma/lzma/lzma_decoder.c @@ -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 // diff --git a/src/liblzma/rangecoder/range_decoder.h b/src/liblzma/rangecoder/range_decoder.h index fb96180f..e0b051fa 100644 --- a/src/liblzma/rangecoder/range_decoder.h +++ b/src/liblzma/rangecoder/range_decoder.h @@ -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; } |