[FFmpeg-devel] [PATCH 10/12] shorten: remove VLA and check for buffer overflow

Benoit Fouet benoit.fouet
Thu Jun 24 14:35:03 CEST 2010


Hi,

On Wed, 23 Jun 2010 18:26:48 +0100 Mans Rullgard wrote:
> ---
>  libavcodec/shorten.c |   18 +++++++++++++++++-
>  1 files changed, 17 insertions(+), 1 deletions(-)
> 
> diff --git a/libavcodec/shorten.c b/libavcodec/shorten.c
> index 7e17f18..f22a080 100644
> --- a/libavcodec/shorten.c
> +++ b/libavcodec/shorten.c
> @@ -83,6 +83,7 @@ typedef struct ShortenContext {
>  
>      int32_t *decoded[MAX_CHANNELS];
>      int32_t *offset[MAX_CHANNELS];
> +    int *coeffs;
>      uint8_t *bitstream;
>      int bitstream_size;
>      int bitstream_index;
> @@ -112,6 +113,8 @@ static av_cold int shorten_decode_init(AVCodecContext * avctx)
>  static int allocate_buffers(ShortenContext *s)
>  {
>      int i, chan;
> +    int *coeffs;
> +
>      for (chan=0; chan<s->channels; chan++) {
>          if(FFMAX(1, s->nmean) >= UINT_MAX/sizeof(int32_t)){
>              av_log(s->avctx, AV_LOG_ERROR, "nmean too large\n");
> @@ -129,6 +132,12 @@ static int allocate_buffers(ShortenContext *s)
>              s->decoded[chan][i] = 0;
>          s->decoded[chan] += s->nwrap;
>      }
> +
> +    coeffs = av_realloc(s->coeffs, s->nwrap * sizeof(*s->coeffs));
> +    if (!coeffs)
> +        return -1;

an ENOMEM would look better.

> +    s->coeffs = coeffs;
> +
>      return 0;
>  }
>  
> @@ -253,7 +262,7 @@ static int16_t * interleave_buffer(int16_t *samples, int nchan, int blocksize, i
>  static void decode_subframe_lpc(ShortenContext *s, int channel, int residual_size, int pred_order)
>  {
>      int sum, i, j;
> -    int coeffs[pred_order];
> +    int *coeffs = s->coeffs;
>  
>      for (i=0; i<pred_order; i++)
>          coeffs[i] = get_sr_golomb_shorten(&s->gb, LPCQUANT);
> @@ -427,6 +436,12 @@ static int shorten_decode_frame(AVCodecContext *avctx,
>                          case FN_QLPC:
>                              {
>                                  int pred_order = get_ur_golomb_shorten(&s->gb, LPCQSIZE);
> +                                if (pred_order > s->nwrap) {
> +                                    av_log(avctx, AV_LOG_ERROR,
> +                                           "invalid pred_order %d\n",
> +                                           pred_order);
> +                                    return -1;
> +                                }
>                                  for (i=0; i<pred_order; i++)
>                                      s->decoded[channel][i - pred_order] -= coffset;
>                                  decode_subframe_lpc(s, channel, residual_size, pred_order);
> @@ -515,6 +530,7 @@ static av_cold int shorten_decode_close(AVCodecContext *avctx)
>          av_freep(&s->offset[i]);
>      }
>      av_freep(&s->bitstream);
> +    av_freep(&s->bitstream);

s/bitstream/coeffs/

Ben



More information about the ffmpeg-devel mailing list