#define CHECKPOINT(x) \
do { \
if (state == 0) { \
+ if (bytestream2_get_bytes_left(gbc) < 4) \
+ return AVERROR_INVALIDDATA; \
value = bytestream2_get_le32(gbc); \
state = 16; \
} \
static int get_opcodes(GetByteContext *gb, uint32_t *table, uint8_t *dst, int op_size, int nb_elements)
{
OpcodeTable optable[1024];
- int sum, x, val, lshift, rshift, ret, size_in_bits, i, idx;
+ int sum, x, val, lshift, rshift, ret, i, idx;
+ int64_t size_in_bits;
unsigned endoffset, newoffset, offset;
unsigned next;
uint8_t *src = (uint8_t *)gb->buffer;
int skip0, skip1, oi0 = 0, oi1 = 0;
int ret, state0 = 0, state1 = 0;
+ if (op_offset < 12)
+ return AVERROR_INVALIDDATA;
+
dst = tex_data;
bytestream2_skip(gb, op_offset - 12);
if (op_size0 > max_op_size0)
avctx->pix_fmt = AV_PIX_FMT_RGBA;
avctx->colorspace = AVCOL_SPC_RGB;
+ ctx->tex_funct = NULL;
+ ctx->tex_funct_planar[0] = NULL;
+ ctx->tex_funct_planar[1] = NULL;
+
tag = bytestream2_get_le32(gbc);
switch (tag) {
case MKBETAG('D', 'X', 'T', '1'):
ret = decompress_tex(avctx);
if (ret < 0)
return ret;
+ {
+ int w_block = avctx->coded_width / ctx->texture_block_w;
+ int h_block = avctx->coded_height / ctx->texture_block_h;
+ if (w_block * h_block * ctx->tex_step > ctx->tex_size * 8LL)
+ return AVERROR_INVALIDDATA;
+ }
tframe.f = data;
ret = ff_thread_get_buffer(avctx, &tframe, 0);