lzx_decode(struct lzx_stream *strm, int last)
{
struct lzx_dec *ds = strm->ds;
- int c, i;
+ int c, i, r;
#define ST_RD_TRANSLATION 0
#define ST_RD_TRANSLATION_SIZE 1
#define ST_RD_BLOCK_TYPE 2
/*
* Get path lengths of first 256 elements of main tree.
*/
- if (!lzx_read_bitlen(strm, &ds->mt, 256)) {
+ r = lzx_read_bitlen(strm, &ds->mt, 256);
+ if (r < 0)
+ goto failed;
+ else if (!r) {
ds->state = ST_MAIN_TREE_256;
if (last)
goto failed;
/*
* Get path lengths of remaining elements of main tree.
*/
- if (!lzx_read_bitlen(strm, &ds->mt, -1)) {
+ r = lzx_read_bitlen(strm, &ds->mt, -1);
+ if (r < 0)
+ goto failed;
+ else if (!r) {
ds->state = ST_MAIN_TREE_REM;
if (last)
goto failed;
/*
* Get path lengths of remaining elements of main tree.
*/
- if (!lzx_read_bitlen(strm, &ds->lt, -1)) {
+ r = lzx_read_bitlen(strm, &ds->lt, -1);
+ if (r < 0)
+ goto failed;
+ else if (!r) {
ds->state = ST_LENGTH_TREE;
if (last)
goto failed;
goto getdata;
lzx_br_consume(strm, ds->pt.bitlen[c]);
same = lzx_br_bits(strm, 4) + 4;
+ if (i + same > end)
+ return (-1);
lzx_br_consume(strm, 4);
for (j = 0; j < same; j++)
d->bitlen[i++] = 0;
goto getdata;
lzx_br_consume(strm, ds->pt.bitlen[c]);
same = lzx_br_bits(strm, 5) + 20;
+ if (i + same > end)
+ return (-1);
lzx_br_consume(strm, 5);
memset(d->bitlen + i, 0, same);
i += same;
goto getdata;
lzx_br_consume(strm, ds->pt.bitlen[c]);
same = lzx_br_bits(strm, 1) + 4;
+ if (i + same > end)
+ return (-1);
lzx_br_consume(strm, 1);
c = ds->pt.tbl[lzx_br_bits(strm, ds->pt.max_bits)];
lzx_br_consume(strm, ds->pt.bitlen[c]);