[FFmpeg-devel] [PATCH] add sanity checks to truemotion2 (issue 2512)

Stefano Sabatini stefano.sabatini-lala
Sun Jan 9 01:23:07 CET 2011


On date Saturday 2011-01-08 19:10:06 -0500, Daniel Kang encoded:
> truemotion2 videos with invalid metadata crashes ffmpeg. There are
> multiple places where the decoder (demuxer?) overreads a buffer. The
> patch adds several checks for this. Are there any comments?

> From fb6f2b4591c059887fa32c5277aade5964b6bc70 Mon Sep 17 00:00:00 2001
> From: Daniel Kang <daniel.d.kang at gmail.com>
> Date: Sat, 8 Jan 2011 16:11:31 -0500
> Subject: [PATCH] Fix several errors in truemotion2 decoding
> 
> ---
>  libavcodec/truemotion2.c |   16 +++++++++++++---
>  1 files changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/libavcodec/truemotion2.c b/libavcodec/truemotion2.c
> index 5013a9e..9c08d61 100644
> --- a/libavcodec/truemotion2.c
> +++ b/libavcodec/truemotion2.c
> @@ -260,7 +260,7 @@ static int tm2_read_deltas(TM2Context *ctx, int stream_id) {
>      return 0;
>  }
> 
> -static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id) {
> +static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id, int buf_size) {

Nit++: "{" on following line per K&R style

>      int i;
>      int cur = 0;
>      int skip = 0;
> @@ -274,6 +274,11 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id) {
>      if(len == 0)
>          return 4;
> 
> +    if(len >= INT_MAX/4-1 || len < 0 || len > buf_size) {

nit: if_(

> +        av_log(ctx->avctx, AV_LOG_ERROR, "Error, invalid stream size.\n");
> +        return -1;

Please return meaningful error codes, AVERROR_INVALIDDATA in this case.

> +    }
> +
>      toks = AV_RB32(buf); buf += 4; cur += 4;
>      if(toks & 1) {
>          len = AV_RB32(buf); buf += 4; cur += 4;
> @@ -313,8 +318,13 @@ static int tm2_read_stream(TM2Context *ctx, const uint8_t *buf, int stream_id) {
>      len = AV_RB32(buf); buf += 4; cur += 4;
>      if(len > 0) {
>          init_get_bits(&ctx->gb, buf, (skip - cur) * 8);
> -        for(i = 0; i < toks; i++)
> +        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 -1;

ditto
-- 
FFmpeg = Frenzy and Formidable Miracolous Proud Elected Guru



More information about the ffmpeg-devel mailing list