X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftruemotion2.c;h=245a32a8d769d2288926a975f992eeda826a64d8;hb=7158ce778f82b3d323851283f6c1b9145f408823;hp=7912d3909e8055f97956e1a35cb7d3882d21904e;hpb=06d69a2d225ae0db433b62f0fa537b06e29b0db5;p=ffmpeg diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c index 7912d3909e8..245a32a8d76 100644 --- a/libavcodec/truemotion2.c +++ b/libavcodec/truemotion2.c @@ -344,31 +344,35 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i /* check if we have sane number of tokens */ if ((toks < 0) || (toks > 0xFFFFFF)) { av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect number of tokens: %i\n", toks); - tm2_free_codes(&codes); - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto end; } ret = av_reallocp_array(&ctx->tokens[stream_id], toks, sizeof(int)); if (ret < 0) { ctx->tok_lens[stream_id] = 0; - return ret; + goto end; } ctx->tok_lens[stream_id] = toks; len = bytestream2_get_be32(&gb); if (len > 0) { pos = bytestream2_tell(&gb); - if (skip <= pos) - return AVERROR_INVALIDDATA; + if (skip <= pos) { + ret = AVERROR_INVALIDDATA; + goto end; + } init_get_bits(&ctx->gb, buf + pos, (skip - pos) * 8); for (i = 0; i < toks; i++) { if (get_bits_left(&ctx->gb) <= 0) { av_log(ctx->avctx, AV_LOG_ERROR, "Incorrect number of tokens: %i\n", toks); - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto end; } ctx->tokens[stream_id][i] = tm2_get_token(&ctx->gb, &codes); if (stream_id <= TM2_MOT && ctx->tokens[stream_id][i] >= TM2_DELTAS || ctx->tokens[stream_id][i]<0) { av_log(ctx->avctx, AV_LOG_ERROR, "Invalid delta token index %d for type %d, n=%d\n", ctx->tokens[stream_id][i], stream_id, i); - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto end; } } } else { @@ -377,13 +381,17 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, i if (stream_id <= TM2_MOT && ctx->tokens[stream_id][i] >= TM2_DELTAS) { av_log(ctx->avctx, AV_LOG_ERROR, "Invalid delta token index %d for type %d, n=%d\n", ctx->tokens[stream_id][i], stream_id, i); - return AVERROR_INVALIDDATA; + ret = AVERROR_INVALIDDATA; + goto end; } } } - tm2_free_codes(&codes); - return skip; + ret = skip; + +end: + tm2_free_codes(&codes); + return ret; } static inline int GET_TOK(TM2Context *ctx,int type)