[FFmpeg-cvslog] r26309 - in trunk: libavcodec/pcm.c libavformat/vocdec.c

cehoyos subversion
Tue Jan 11 15:08:45 CET 2011


Author: cehoyos
Date: Tue Jan 11 15:08:45 2011
New Revision: 26309

Log:
Do not crash for illegal sample size, fixes issue 2502.

Patch by Daniel Kang, daniel.d.kang at gmail

Modified:
   trunk/libavcodec/pcm.c
   trunk/libavformat/vocdec.c

Modified: trunk/libavcodec/pcm.c
==============================================================================
--- trunk/libavcodec/pcm.c	Tue Jan 11 13:17:27 2011	(r26308)
+++ trunk/libavcodec/pcm.c	Tue Jan 11 15:08:45 2011	(r26309)
@@ -292,6 +292,11 @@ static int pcm_decode_frame(AVCodecConte
         /* we process 40-bit blocks per channel for LXF */
         sample_size = 5;
 
+    if (sample_size == 0) {
+        av_log(avctx, AV_LOG_ERROR, "Invalid sample_size\n");
+        return AVERROR(EINVAL);
+    }
+
     n = avctx->channels * sample_size;
 
     if(n && buf_size % n){

Modified: trunk/libavformat/vocdec.c
==============================================================================
--- trunk/libavformat/vocdec.c	Tue Jan 11 13:17:27 2011	(r26308)
+++ trunk/libavformat/vocdec.c	Tue Jan 11 15:08:45 2011	(r26309)
@@ -68,7 +68,7 @@ voc_get_packet(AVFormatContext *s, AVPac
     AVCodecContext *dec = st->codec;
     ByteIOContext *pb = s->pb;
     VocType type;
-    int size;
+    int size, tmp_codec;
     int sample_rate = 0;
     int channels = 1;
 
@@ -90,7 +90,11 @@ voc_get_packet(AVFormatContext *s, AVPac
             if (sample_rate)
                 dec->sample_rate = sample_rate;
             dec->channels = channels;
-            dec->codec_id = ff_codec_get_id(ff_voc_codec_tags, get_byte(pb));
+            tmp_codec = ff_codec_get_id(ff_voc_codec_tags, get_byte(pb));
+            if (dec->codec_id == CODEC_ID_NONE)
+                dec->codec_id = tmp_codec;
+            else if (dec->codec_id != tmp_codec)
+                av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
             dec->bits_per_coded_sample = av_get_bits_per_sample(dec->codec_id);
             voc->remaining_size -= 2;
             max_size -= 2;
@@ -113,7 +117,11 @@ voc_get_packet(AVFormatContext *s, AVPac
             dec->sample_rate = get_le32(pb);
             dec->bits_per_coded_sample = get_byte(pb);
             dec->channels = get_byte(pb);
-            dec->codec_id = ff_codec_get_id(ff_voc_codec_tags, get_le16(pb));
+            tmp_codec = ff_codec_get_id(ff_voc_codec_tags, get_byte(pb));
+            if (dec->codec_id == CODEC_ID_NONE)
+                dec->codec_id = tmp_codec;
+            else if (dec->codec_id != tmp_codec)
+                av_log(s, AV_LOG_WARNING, "Ignoring mid-stream change in audio codec\n");
             url_fskip(pb, 4);
             voc->remaining_size -= 12;
             max_size -= 12;
@@ -125,6 +133,10 @@ voc_get_packet(AVFormatContext *s, AVPac
             voc->remaining_size = 0;
             break;
         }
+        if (dec->codec_id == CODEC_ID_NONE) {
+            av_log(s, AV_LOG_ERROR, "Invalid codec_id\n");
+            if (s->audio_codec_id == CODEC_ID_NONE) return AVERROR(EINVAL);
+        }
     }
 
     dec->bit_rate = dec->sample_rate * dec->bits_per_coded_sample;



More information about the ffmpeg-cvslog mailing list