Merge commit 'de2e5777e225e75813daf2373c95e223651fd89a'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Jun 2013 11:41:27 +0000 (13:41 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Jun 2013 11:41:27 +0000 (13:41 +0200)
* commit 'de2e5777e225e75813daf2373c95e223651fd89a':
  4xm: validate the buffer size before parsing it

Conflicts:
libavcodec/4xm.c

See: 9c661e95

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/4xm.c

@@@ -438,9 -418,9 +438,9 @@@ static int decode_p_frame(FourXContext 
      src = (uint16_t *)f->last_picture->data[0];
  
      if (f->version > 1) {
 -        if (length < 20)
 -            return AVERROR_INVALIDDATA;
          extra           = 20;
-             return -1;
 +        if (length < extra)
++            return AVERROR_INVALIDDATA;
          bitstream_size  = AV_RL32(buf + 8);
          wordstream_size = AV_RL32(buf + 12);
          bytestream_size = AV_RL32(buf + 16);
@@@ -836,21 -803,16 +840,23 @@@ static int decode_frame(AVCodecContext 
  
      if (frame_4cc == AV_RL32("cfrm")) {
          int free_index       = -1;
+         int id, whole_size;
          const int data_size  = buf_size - 20;
-         const int id         = AV_RL32(buf + 12);
-         const int whole_size = AV_RL32(buf + 16);
          CFrameBuffer *cfrm;
  
-         if (data_size < 0 || whole_size < 0) {
-             av_log(f->avctx, AV_LOG_ERROR, "sizes invalid\n");
 -        if (data_size < 0)
++        if (f->version <= 1) {
++            av_log(f->avctx, AV_LOG_ERROR, "cfrm in version %d\n", f->version);
              return AVERROR_INVALIDDATA;
 +        }
  
-         if (f->version <= 1) {
-             av_log(f->avctx, AV_LOG_ERROR, "cfrm in version %d\n", f->version);
+         id         = AV_RL32(buf + 12);
+         whole_size = AV_RL32(buf + 16);
++        if (data_size < 0 || whole_size < 0) {
++            av_log(f->avctx, AV_LOG_ERROR, "sizes invalid\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +
          for (i = 0; i < CFRAME_BUFFER_COUNT; i++)
              if (f->cfrm[i].id && f->cfrm[i].id < avctx->frame_number)
                  av_log(f->avctx, AV_LOG_ERROR, "lost c frame %d\n",