Browse Source

utils: Check for extradata size overflows.

tags/n0.10
Alex Converse 13 years ago
parent
commit
4df30f7114
3 changed files with 13 additions and 1 deletions
  1. +7
    -0
      libavcodec/internal.h
  2. +3
    -0
      libavcodec/utils.c
  3. +3
    -1
      libavformat/utils.c

+ 7
- 0
libavcodec/internal.h View File

@@ -94,4 +94,11 @@ unsigned int avpriv_toupper4(unsigned int x);
int avpriv_lock_avformat(void);
int avpriv_unlock_avformat(void);

/**
* Maximum size in bytes of extradata.
* This value was chosen such that every bit of the buffer is
* addressable by a 32-bit signed integer as used by get_bits.
*/
#define FF_MAX_EXTRADATA_SIZE ((1 << 28) - FF_INPUT_BUFFER_PADDING_SIZE)

#endif /* AVCODEC_INTERNAL_H */

+ 3
- 0
libavcodec/utils.c View File

@@ -610,6 +610,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVD
int ret = 0;
AVDictionary *tmp = NULL;

if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
return AVERROR(EINVAL);

if (options)
av_dict_copy(&tmp, *options, 0);



+ 3
- 1
libavformat/utils.c View File

@@ -2442,9 +2442,11 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
}
if(st->parser && st->parser->parser->split && !st->codec->extradata){
int i= st->parser->parser->split(st->codec, pkt->data, pkt->size);
if(i){
if (i > 0 && i < FF_MAX_EXTRADATA_SIZE) {
st->codec->extradata_size= i;
st->codec->extradata= av_malloc(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
if (!st->codec->extradata)
return AVERROR(ENOMEM);
memcpy(st->codec->extradata, pkt->data, st->codec->extradata_size);
memset(st->codec->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
}


Loading…
Cancel
Save