Merge commit '58c95448e42d34910b939363949ba1a92c06b0b0'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Jun 2013 22:44:32 +0000 (00:44 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 16 Jun 2013 22:44:32 +0000 (00:44 +0200)
* commit '58c95448e42d34910b939363949ba1a92c06b0b0':
  smacker: pad the extradata allocation

Conflicts:
libavformat/smacker.c

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

diff --combined libavformat/smacker.c
index e04a214ff3a080dc38e4b38d4446a80e0ce2991d,7eed34d51686805c061395f586b458583274d780..7132a855654e78d5a0c730a082dd7de4145f380b
@@@ -2,20 -2,20 +2,20 @@@
   * Smacker demuxer
   * Copyright (c) 2006 Konstantin Shishkov
   *
 - * 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
   */
  
@@@ -110,7 -110,7 +110,7 @@@ static int smacker_read_header(AVFormat
      /* read and check header */
      smk->magic = avio_rl32(pb);
      if (smk->magic != MKTAG('S', 'M', 'K', '2') && smk->magic != MKTAG('S', 'M', 'K', '4'))
 -        return -1;
 +        return AVERROR_INVALIDDATA;
      smk->width = avio_rl32(pb);
      smk->height = avio_rl32(pb);
      smk->frames = avio_rl32(pb);
  
      if(smk->treesize >= UINT_MAX/4){ // smk->treesize + 16 must not overflow (this check is probably redundant)
          av_log(s, AV_LOG_ERROR, "treesize too large\n");
 -        return -1;
 +        return AVERROR_INVALIDDATA;
      }
  
  //FIXME remove extradata "rebuilding"
      /* setup data */
      if(smk->frames > 0xFFFFFF) {
          av_log(s, AV_LOG_ERROR, "Too many frames: %i\n", smk->frames);
 -        return -1;
 +        return AVERROR_INVALIDDATA;
      }
      smk->frm_size = av_malloc(smk->frames * 4);
      smk->frm_flags = av_malloc(smk->frames);
      /* init video codec */
      st = avformat_new_stream(s, NULL);
      if (!st)
 -        return -1;
 +        return AVERROR(ENOMEM);
      smk->videoindex = st->index;
      st->codec->width = smk->width;
      st->codec->height = smk->height;
  
  
      /* load trees to extradata, they will be unpacked by decoder */
-     st->codec->extradata = av_malloc(smk->treesize + 16 + FF_INPUT_BUFFER_PADDING_SIZE);
+     st->codec->extradata = av_mallocz(smk->treesize + 16 +
+                                       FF_INPUT_BUFFER_PADDING_SIZE);
      st->codec->extradata_size = smk->treesize + 16;
      if(!st->codec->extradata){
          av_log(s, AV_LOG_ERROR, "Cannot allocate %i bytes of extradata\n", smk->treesize + 16);
          av_free(smk->frm_size);
          av_free(smk->frm_flags);
 -        return -1;
 +        return AVERROR(ENOMEM);
      }
      ret = avio_read(pb, st->codec->extradata + 16, st->codec->extradata_size - 16);
      if(ret != st->codec->extradata_size - 16){
@@@ -245,7 -246,7 +246,7 @@@ static int smacker_read_packet(AVFormat
      int frame_size = 0;
      int palchange = 0;
  
 -    if (s->pb->eof_reached || smk->cur_frame >= smk->frames)
 +    if (url_feof(s->pb) || smk->cur_frame >= smk->frames)
          return AVERROR_EOF;
  
      /* if we demuxed all streams, pass another frame */
              memcpy(oldpal, pal, 768);
              size = avio_r8(s->pb);
              size = size * 4 - 1;
 +            if(size + 1 > frame_size)
 +                return AVERROR_INVALIDDATA;
              frame_size -= size;
              frame_size--;
              sz = 0;
          /* if audio chunks are present, put them to stack and retrieve later */
          for(i = 0; i < 7; i++) {
              if(flags & 1) {
 -                int size;
 +                unsigned int size;
                  uint8_t *tmpbuf;
  
                  size = avio_rl32(s->pb) - 4;
 +                if(size + 4L > frame_size)
 +                    return AVERROR_INVALIDDATA;
                  frame_size -= size;
                  frame_size -= 4;
                  smk->curstream++;
@@@ -371,7 -368,7 +372,7 @@@ static int smacker_read_close(AVFormatC
  
  AVInputFormat ff_smacker_demuxer = {
      .name           = "smk",
 -    .long_name      = NULL_IF_CONFIG_SMALL("Smacker video"),
 +    .long_name      = NULL_IF_CONFIG_SMALL("Smacker"),
      .priv_data_size = sizeof(SmackerContext),
      .read_probe     = smacker_probe,
      .read_header    = smacker_read_header,