Merge commit 'e30b068ef79f604ff439418da07f7e2efd01d4ea'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 29 Jun 2013 09:19:37 +0000 (11:19 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 29 Jun 2013 09:37:09 +0000 (11:37 +0200)
* commit 'e30b068ef79f604ff439418da07f7e2efd01d4ea':
  wmapro: make sure there is room to store the current packet

The check is replaced by an assert as it is impossible to occur
See: 780d45473c32fa356c8ce385c3ea4692567c3228

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

diff --combined libavcodec/wmaprodec.c
index a71a67e12d22bf6705cdd07cb8d1d98492993182,8fdfbf866f2633c66ee77d955f0042b65544d933..580b7b454b7cf8efdcb942e5c52d2a87acaba57f
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
   * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -336,12 -336,6 +336,12 @@@ static av_cold int decode_init(AVCodecC
          return AVERROR_INVALIDDATA;
      }
  
 +    if (s->min_samples_per_subframe < (1<<WMAPRO_BLOCK_MIN_BITS)) {
 +        av_log(avctx, AV_LOG_ERROR, "min_samples_per_subframe of %d too small\n",
 +               s->min_samples_per_subframe);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      if (s->avctx->sample_rate <= 0) {
          av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n");
          return AVERROR_INVALIDDATA;
          }
          s->sfb_offsets[i][band - 1] = subframe_len;
          s->num_sfb[i]               = band - 1;
 +        if (s->num_sfb[i] <= 0) {
 +            av_log(avctx, AV_LOG_ERROR, "num_sfb invalid\n");
 +            return AVERROR_INVALIDDATA;
 +        }
      }
  
  
@@@ -1143,7 -1133,7 +1143,7 @@@ static int decode_subframe(WMAProDecode
          int num_fill_bits;
          if (!(num_fill_bits = get_bits(&s->gb, 2))) {
              int len = get_bits(&s->gb, 4);
 -            num_fill_bits = get_bits(&s->gb, len) + 1;
 +            num_fill_bits = (len ? get_bits(&s->gb, len) : 0) + 1;
          }
  
          if (num_fill_bits >= 0) {
              transmit_coeffs = 1;
      }
  
 +    av_assert0(s->subframe_len <= WMAPRO_BLOCK_MAX_SIZE);
      if (transmit_coeffs) {
          int step;
          int quant_step = 90 * s->bits_per_sample >> 4;
              for (i = 0; i < s->channels_for_cur_subframe; i++) {
                  int c = s->channel_indexes_for_cur_subframe[i];
                  int num_vec_coeffs = get_bits(&s->gb, num_bits) << 2;
 -                if (num_vec_coeffs > WMAPRO_BLOCK_MAX_SIZE) {
 +                if (num_vec_coeffs > s->subframe_len) {
                      av_log(s->avctx, AV_LOG_ERROR, "num_vec_coeffs %d is too large\n", num_vec_coeffs);
                      return AVERROR_INVALIDDATA;
                  }
@@@ -1380,6 -1369,7 +1380,6 @@@ static int decode_frame(WMAProDecodeCt
      /* get output buffer */
      frame->nb_samples = s->samples_per_frame;
      if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
          s->packet_loss = 1;
          return 0;
      }
@@@ -1452,7 -1442,7 +1452,7 @@@ static void save_bits(WMAProDecodeCtx *
      int buflen;
  
      /** when the frame data does not need to be concatenated, the input buffer
 -        is resetted and additional bits from the previous frame are copyed
 +        is reset and additional bits from the previous frame are copied
          and skipped later so that a fast byte copy is possible */
  
      if (!append) {
          init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
      }
  
 -    buflen = (s->num_saved_bits + len + 8) >> 3;
 +    buflen = (put_bits_count(&s->pb) + len + 8) >> 3;
  
      if (len <= 0 || buflen > MAX_FRAMESIZE) {
          avpriv_request_sample(s->avctx, "Too small input buffer");
          return;
      }
  
 -    if (len > put_bits_left(&s->pb)) {
 -        av_log(s->avctx, AV_LOG_ERROR,
 -               "Cannot append %d bits, only %d bits available.\n",
 -               len, put_bits_left(&s->pb));
 -        s->packet_loss = 1;
 -        return;
 -    }
++    av_assert0(len <= put_bits_left(&s->pb));
      s->num_saved_bits += len;
      if (!append) {
          avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
@@@ -1581,8 -1579,7 +1583,8 @@@ static int decode_packet(AVCodecContex
              (frame_size = show_bits(gb, s->log2_frame_size)) &&
              frame_size <= remaining_bits(s, gb)) {
              save_bits(s, gb, frame_size, 0);
 -            s->packet_done = !decode_frame(s, data, got_frame_ptr);
 +            if (!s->packet_loss)
 +                s->packet_done = !decode_frame(s, data, got_frame_ptr);
          } else if (!s->len_prefix
                     && s->num_saved_bits > get_bits_count(&s->gb)) {
              /** when the frames do not have a length prefix, we don't know