diff --git a/libavcodec/vble.c b/libavcodec/vble.c index 41d78dc6cd..1790a39e17 100644 --- a/libavcodec/vble.c +++ b/libavcodec/vble.c @@ -41,6 +41,7 @@ typedef struct { static int vble_unpack(VBLEContext *ctx, GetBitContext *gb) { int i; + int allbits = 0; static const uint8_t LUT[256] = { 8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, 5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0, @@ -68,16 +69,17 @@ static int vble_unpack(VBLEContext *ctx, GetBitContext *gb) return -1; ctx->len[i] = 8; } + allbits += ctx->len[i]; } + /* Check we have enough bits left */ + if (get_bits_left(gb) < allbits) + return -1; + /* For any values that have length 0 */ memset(ctx->val, 0, ctx->size); for (i = 0; i < ctx->size; i++) { - /* Check we have enough bits left */ - if (get_bits_left(gb) < ctx->len[i]) - return -1; - /* get_bits can't take a length of 0 */ if (ctx->len[i]) ctx->val[i] = (1 << ctx->len[i]) + get_bits(gb, ctx->len[i]) - 1;