diff --git a/libavcodec/tta.c b/libavcodec/tta.c index 49d59538d3..853f6a2aae 100644 --- a/libavcodec/tta.c +++ b/libavcodec/tta.c @@ -339,12 +339,16 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, unary--; } - if (get_bits_left(&s->gb) < k) - return -1; + if (get_bits_left(&s->gb) < k) { + ret = AVERROR_INVALIDDATA; + goto error; + } if (k) { - if (k > MIN_CACHE_BITS) - return -1; + if (k > MIN_CACHE_BITS) { + ret = AVERROR_INVALIDDATA; + goto error; + } value = (unary << k) + get_bits(&s->gb, k); } else value = unary; @@ -397,8 +401,10 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, } } - if (get_bits_left(&s->gb) < 32) - return -1; + if (get_bits_left(&s->gb) < 32) { + ret = AVERROR_INVALIDDATA; + goto error; + } skip_bits_long(&s->gb, 32); // frame crc // convert to output buffer @@ -419,6 +425,11 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data, *(AVFrame *)data = s->frame; return buf_size; +error: + // reset decode buffer + if (s->bps == 3) + s->decode_buffer = NULL; + return ret; } static av_cold int tta_decode_close(AVCodecContext *avctx) {