Merge commit 'f8a72f041c049e812dfa1f32156327e9778f5710' into release/1.1
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 7 Oct 2013 22:24:54 +0000 (00:24 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 7 Oct 2013 22:24:54 +0000 (00:24 +0200)
* commit 'f8a72f041c049e812dfa1f32156327e9778f5710':
  mpc8: Check the seek table size parsed from the bitstream
  zmbvdec: Check the buffer size for uncompressed data
  ape: Don't allow the seektable to be omitted
  shorten: Break out of loop looking for fmt chunk if none is found
  shorten: Use a checked bytestream reader for the wave header
  smacker: Make sure we don't fill in huffman codes out of range
  smacker: Avoid integer overflow when allocating packets
  smacker: Don't return packets in unallocated streams
  dsicin: Add some basic sanity checks for fields read from the file

Conflicts:
libavcodec/shorten.c
libavcodec/smacker.c
libavcodec/zmbv.c
libavformat/mpc8.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/shorten.c
libavcodec/smacker.c
libavcodec/zmbv.c
libavformat/ape.c
libavformat/dsicin.c
libavformat/mpc8.c
libavformat/smacker.c

@@@ -211,11 -204,13 +211,13 @@@ static int init_offset(ShortenContext *
  static int decode_wave_header(AVCodecContext *avctx, const uint8_t *header,
                                int header_size)
  {
 -    int len;
 +    int len, bps;
      short wave_format;
-     const uint8_t *end= header + header_size;
+     GetByteContext gb;
  
-     if (bytestream_get_le32(&header) != MKTAG('R', 'I', 'F', 'F')) {
+     bytestream2_init(&gb, header, header_size);
+     if (bytestream2_get_le32(&gb) != MKTAG('R', 'I', 'F', 'F')) {
          av_log(avctx, AV_LOG_ERROR, "missing RIFF tag\n");
          return AVERROR_INVALIDDATA;
      }
          return AVERROR_INVALIDDATA;
      }
  
-     while (bytestream_get_le32(&header) != MKTAG('f', 'm', 't', ' ')) {
-         len     = bytestream_get_le32(&header);
-         if (len<0 || end - header - 8 < len)
+     while (bytestream2_get_le32(&gb) != MKTAG('f', 'm', 't', ' ')) {
+         len = bytestream2_get_le32(&gb);
+         bytestream2_skip(&gb, len);
 -        if (bytestream2_get_bytes_left(&gb) < 16) {
++        if (len < 0 || bytestream2_get_bytes_left(&gb) < 16) {
+             av_log(avctx, AV_LOG_ERROR, "no fmt chunk found\n");
              return AVERROR_INVALIDDATA;
-         header += len;
+         }
      }
-     len = bytestream_get_le32(&header);
+     len = bytestream2_get_le32(&gb);
  
      if (len < 16) {
          av_log(avctx, AV_LOG_ERROR, "fmt chunk was too short\n");
          return AVERROR(ENOSYS);
      }
  
-     header += 2;        // skip channels    (already got from shorten header)
-     avctx->sample_rate = bytestream_get_le32(&header);
-     header += 4;        // skip bit rate    (represents original uncompressed bit rate)
-     header += 2;        // skip block align (not needed)
-     bps     = bytestream_get_le16(&header);
+     bytestream2_skip(&gb, 2); // skip channels    (already got from shorten header)
+     avctx->sample_rate = bytestream2_get_le32(&gb);
+     bytestream2_skip(&gb, 4); // skip bit rate    (represents original uncompressed bit rate)
+     bytestream2_skip(&gb, 2); // skip block align (not needed)
 -    avctx->bits_per_coded_sample = bytestream2_get_le16(&gb);
++    bps = bytestream2_get_le16(&gb);
 +    avctx->bits_per_coded_sample = bps;
  
 -    if (avctx->bits_per_coded_sample != 16) {
 -        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample\n");
 +    if (bps != 16 && bps != 8) {
 +        av_log(avctx, AV_LOG_ERROR, "unsupported number of bits per sample: %d\n", bps);
          return AVERROR(ENOSYS);
      }
  
@@@ -268,10 -257,11 +268,12 @@@ static int smacker_decode_header_tree(S
      if(ctx.last[0] == -1) ctx.last[0] = huff.current++;
      if(ctx.last[1] == -1) ctx.last[1] = huff.current++;
      if(ctx.last[2] == -1) ctx.last[2] = huff.current++;
-     if(huff.current > huff.length){
+     if (ctx.last[0] >= huff.length ||
+         ctx.last[1] >= huff.length ||
+         ctx.last[2] >= huff.length) {
+         av_log(smk->avctx, AV_LOG_ERROR, "Huffman codes out of range\n");
 +        ctx.last[0] = ctx.last[1] = ctx.last[2] = 1;
-         av_log(smk->avctx, AV_LOG_ERROR, "bigtree damaged\n");
-         return AVERROR_INVALIDDATA;
+         err = AVERROR_INVALIDDATA;
      }
  
      *recodes = huff.values;
Simple merge
@@@ -251,9 -253,9 +251,9 @@@ static int ape_read_header(AVFormatCont
      if(ape->totalframes > UINT_MAX / sizeof(APEFrame)){
          av_log(s, AV_LOG_ERROR, "Too many frames: %"PRIu32"\n",
                 ape->totalframes);
 -        return -1;
 +        return AVERROR_INVALIDDATA;
      }
-     if (ape->seektablelength && (ape->seektablelength / sizeof(*ape->seektable)) < ape->totalframes) {
+     if (ape->seektablelength / sizeof(*ape->seektable) < ape->totalframes) {
          av_log(s, AV_LOG_ERROR,
                 "Number of seek entries is less than number of frames: %zu vs. %"PRIu32"\n",
                 ape->seektablelength / sizeof(*ape->seektable), ape->totalframes);
Simple merge
@@@ -145,8 -145,8 +145,8 @@@ static void mpc8_parse_seektable(AVForm
          av_log(s, AV_LOG_ERROR, "No seek table at given position\n");
          return;
      }
 -    if (size < 0 || size >= INT_MAX / 2) {
 +    if (size > INT_MAX/10 || size<=0) {
-         av_log(s, AV_LOG_ERROR, "Seek table size is invalid\n");
+         av_log(s, AV_LOG_ERROR, "Bad seek table size\n");
          return;
      }
      if(!(buf = av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE)))
Simple merge