ogg: check that the expected number of headers had been parsed
authorLuca Barbato <lu_zero@gentoo.org>
Wed, 19 Sep 2012 23:01:43 +0000 (01:01 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Mon, 24 Sep 2012 20:35:29 +0000 (22:35 +0200)
Not having the header for a codec is a tell-tale of a broken file.

libavformat/oggdec.c
libavformat/oggdec.h
libavformat/oggparsecelt.c
libavformat/oggparsedirac.c
libavformat/oggparseflac.c
libavformat/oggparseogm.c
libavformat/oggparseskeleton.c
libavformat/oggparsespeex.c
libavformat/oggparsetheora.c
libavformat/oggparsevorbis.c

index e04a4e7..c8b2a85 100644 (file)
@@ -406,6 +406,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
                     s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos);
             }
         }else{
+            os->nb_header++;
             os->pstart += os->psize;
             os->psize = 0;
         }
@@ -445,7 +446,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
 static int ogg_get_headers(AVFormatContext *s)
 {
     struct ogg *ogg = s->priv_data;
-    int ret;
+    int ret, i;
 
     do{
         ret = ogg_packet(s, NULL, NULL, NULL, NULL);
@@ -453,6 +454,16 @@ static int ogg_get_headers(AVFormatContext *s)
             return ret;
     }while (!ogg->headers);
 
+    for (i = 0; i < ogg->nstreams; i++) {
+        struct ogg_stream *os = ogg->streams + i;
+
+        if (os->codec && os->codec->nb_header &&
+            os->nb_header < os->codec->nb_header) {
+            av_log(s, AV_LOG_ERROR,
+                   "Headers mismatch for stream %d\n", i);
+            return AVERROR_INVALIDDATA;
+        }
+    }
     av_dlog(s, "found headers\n");
 
     return 0;
index 184a628..fa8a5bc 100644 (file)
@@ -51,6 +51,10 @@ struct ogg_codec {
      * 0 if granule is the end time of the associated packet.
      */
     int granule_is_start;
+    /**
+     * Number of expected headers
+     */
+    int nb_header;
 };
 
 struct ogg_stream {
@@ -75,6 +79,7 @@ struct ogg_stream {
     int incomplete; ///< whether we're expecting a continuation in the next page
     int page_end;   ///< current packet is the last one completed in the page
     int keyframe_seek;
+    int nb_header; ///< set to the number of parsed headers
     void *private;
 };
 
index 253ef76..0deccc2 100644 (file)
@@ -93,4 +93,5 @@ const struct ogg_codec ff_celt_codec = {
     .magic     = "CELT    ",
     .magicsize = 8,
     .header    = celt_header,
+    .nb_header = 2,
 };
index cc6f768..55a0b59 100644 (file)
@@ -104,6 +104,7 @@ const struct ogg_codec ff_dirac_codec = {
     .header = dirac_header,
     .gptopts = dirac_gptopts,
     .granule_is_start = 1,
+    .nb_header = 1,
 };
 
 const struct ogg_codec ff_old_dirac_codec = {
@@ -112,4 +113,5 @@ const struct ogg_codec ff_old_dirac_codec = {
     .header = old_dirac_header,
     .gptopts = old_dirac_gptopts,
     .granule_is_start = 1,
+    .nb_header = 1,
 };
index 9860a0e..f59b400 100644 (file)
@@ -88,11 +88,13 @@ old_flac_header (AVFormatContext * s, int idx)
 const struct ogg_codec ff_flac_codec = {
     .magic = "\177FLAC",
     .magicsize = 5,
-    .header = flac_header
+    .header = flac_header,
+    .nb_header = 2,
 };
 
 const struct ogg_codec ff_old_flac_codec = {
     .magic = "fLaC",
     .magicsize = 4,
-    .header = old_flac_header
+    .header = old_flac_header,
+    .nb_header = 0,
 };
index b52969f..7b3cda2 100644 (file)
@@ -156,6 +156,7 @@ const struct ogg_codec ff_ogm_video_codec = {
     .header = ogm_header,
     .packet = ogm_packet,
     .granule_is_start = 1,
+    .nb_header = 2,
 };
 
 const struct ogg_codec ff_ogm_audio_codec = {
@@ -164,6 +165,7 @@ const struct ogg_codec ff_ogm_audio_codec = {
     .header = ogm_header,
     .packet = ogm_packet,
     .granule_is_start = 1,
+    .nb_header = 2,
 };
 
 const struct ogg_codec ff_ogm_text_codec = {
@@ -172,6 +174,7 @@ const struct ogg_codec ff_ogm_text_codec = {
     .header = ogm_header,
     .packet = ogm_packet,
     .granule_is_start = 1,
+    .nb_header = 2,
 };
 
 const struct ogg_codec ff_ogm_old_codec = {
@@ -180,4 +183,5 @@ const struct ogg_codec ff_ogm_old_codec = {
     .header = ogm_dshow_header,
     .packet = ogm_packet,
     .granule_is_start = 1,
+    .nb_header = 1,
 };
index 62dd14d..a49d30b 100644 (file)
@@ -86,4 +86,5 @@ const struct ogg_codec ff_skeleton_codec = {
     .magic = "fishead",
     .magicsize = 8,
     .header = skeleton_header,
+    .nb_header = 0,
 };
index e4dfec5..11b50d5 100644 (file)
@@ -122,5 +122,6 @@ const struct ogg_codec ff_speex_codec = {
     .magic = "Speex   ",
     .magicsize = 8,
     .header = speex_header,
-    .packet = speex_packet
+    .packet = speex_packet,
+    .nb_header = 2,
 };
index 021d3ae..df7a89c 100644 (file)
@@ -150,5 +150,6 @@ const struct ogg_codec ff_theora_codec = {
     .magic = "\200theora",
     .magicsize = 7,
     .header = theora_header,
-    .gptopts = theora_gptopts
+    .gptopts = theora_gptopts,
+    .nb_header = 3,
 };
index f762c94..396a3e3 100644 (file)
@@ -359,4 +359,5 @@ const struct ogg_codec ff_vorbis_codec = {
     .magicsize = 7,
     .header = vorbis_header,
     .packet = vorbis_packet,
+    .nb_header = 3,
 };