Merge commit '94aefb1932be882fd93f66cf790ceb19ff575c19'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Jun 2013 12:10:06 +0000 (14:10 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 13 Jun 2013 12:10:06 +0000 (14:10 +0200)
* commit '94aefb1932be882fd93f66cf790ceb19ff575c19':
  4xm: do not overread the source buffer in decode_p_block

Conflicts:
libavcodec/4xm.c

The checks are replaced by av_assert0() as the conditions should
be impossible. If these asserts fail, there is a bug elsewhere

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

@@@ -375,39 -370,31 +375,41 @@@ static int decode_p_block(FourXContext 
                                    log2w, log2h, stride)) < 0)
              return ret;
      } else if (code == 3 && f->version < 2) {
 -        if (start > src || src > end) {
 -            av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
 -            return AVERROR_INVALIDDATA;
 -        }
++        av_assert0(start <= src && src <= end);
          mcdc(dst, src, log2w, h, stride, 1, 0);
      } else if (code == 4) {
 -        src += f->mv[bytestream2_get_byte(&f->g)];
 +        if (bytestream2_get_bytes_left(&f->g) < 1) {
 +            av_log(f->avctx, AV_LOG_ERROR, "bytestream overread\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        src += f->mv[bytestream2_get_byteu(&f->g)];
          if (start > src || src > end) {
              av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
              return AVERROR_INVALIDDATA;
          }
 -        mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16(&f->g2));
 +        if (bytestream2_get_bytes_left(&f->g2) < 2){
 +            av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        mcdc(dst, src, log2w, h, stride, 1, bytestream2_get_le16u(&f->g2));
      } else if (code == 5) {
 -        if (start > src || src > end) {
 -            av_log(f->avctx, AV_LOG_ERROR, "mv out of pic\n");
 +        if (bytestream2_get_bytes_left(&f->g2) < 2) {
 +            av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
              return AVERROR_INVALIDDATA;
          }
 -        mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16(&f->g2));
++        av_assert0(start <= src && src <= end);
 +        mcdc(dst, src, log2w, h, stride, 0, bytestream2_get_le16u(&f->g2));
      } else if (code == 6) {
 +        if (bytestream2_get_bytes_left(&f->g2) < 4) {
 +            av_log(f->avctx, AV_LOG_ERROR, "wordstream overread\n");
 +            return AVERROR_INVALIDDATA;
 +        }
          if (log2w) {
 -            dst[0]      = bytestream2_get_le16(&f->g2);
 -            dst[1]      = bytestream2_get_le16(&f->g2);
 +            dst[0]      = bytestream2_get_le16u(&f->g2);
 +            dst[1]      = bytestream2_get_le16u(&f->g2);
          } else {
 -            dst[0]      = bytestream2_get_le16(&f->g2);
 -            dst[stride] = bytestream2_get_le16(&f->g2);
 +            dst[0]      = bytestream2_get_le16u(&f->g2);
 +            dst[stride] = bytestream2_get_le16u(&f->g2);
          }
      }
      return 0;