Browse code

ogg: check that the expected number of headers had been parsed

Not having the header for a codec is a tell-tale of a broken file.

Luca Barbato authored on 2012/09/20 08:01:43
Showing 10 changed files
... ...
@@ -406,6 +406,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
406 406
                     s->data_offset = FFMIN(s->data_offset, cur_os->sync_pos);
407 407
             }
408 408
         }else{
409
+            os->nb_header++;
409 410
             os->pstart += os->psize;
410 411
             os->psize = 0;
411 412
         }
... ...
@@ -445,7 +446,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
445 445
 static int ogg_get_headers(AVFormatContext *s)
446 446
 {
447 447
     struct ogg *ogg = s->priv_data;
448
-    int ret;
448
+    int ret, i;
449 449
 
450 450
     do{
451 451
         ret = ogg_packet(s, NULL, NULL, NULL, NULL);
... ...
@@ -453,6 +454,16 @@ static int ogg_get_headers(AVFormatContext *s)
453 453
             return ret;
454 454
     }while (!ogg->headers);
455 455
 
456
+    for (i = 0; i < ogg->nstreams; i++) {
457
+        struct ogg_stream *os = ogg->streams + i;
458
+
459
+        if (os->codec && os->codec->nb_header &&
460
+            os->nb_header < os->codec->nb_header) {
461
+            av_log(s, AV_LOG_ERROR,
462
+                   "Headers mismatch for stream %d\n", i);
463
+            return AVERROR_INVALIDDATA;
464
+        }
465
+    }
456 466
     av_dlog(s, "found headers\n");
457 467
 
458 468
     return 0;
... ...
@@ -51,6 +51,10 @@ struct ogg_codec {
51 51
      * 0 if granule is the end time of the associated packet.
52 52
      */
53 53
     int granule_is_start;
54
+    /**
55
+     * Number of expected headers
56
+     */
57
+    int nb_header;
54 58
 };
55 59
 
56 60
 struct ogg_stream {
... ...
@@ -75,6 +79,7 @@ struct ogg_stream {
75 75
     int incomplete; ///< whether we're expecting a continuation in the next page
76 76
     int page_end;   ///< current packet is the last one completed in the page
77 77
     int keyframe_seek;
78
+    int nb_header; ///< set to the number of parsed headers
78 79
     void *private;
79 80
 };
80 81
 
... ...
@@ -93,4 +93,5 @@ const struct ogg_codec ff_celt_codec = {
93 93
     .magic     = "CELT    ",
94 94
     .magicsize = 8,
95 95
     .header    = celt_header,
96
+    .nb_header = 2,
96 97
 };
... ...
@@ -104,6 +104,7 @@ const struct ogg_codec ff_dirac_codec = {
104 104
     .header = dirac_header,
105 105
     .gptopts = dirac_gptopts,
106 106
     .granule_is_start = 1,
107
+    .nb_header = 1,
107 108
 };
108 109
 
109 110
 const struct ogg_codec ff_old_dirac_codec = {
... ...
@@ -112,4 +113,5 @@ const struct ogg_codec ff_old_dirac_codec = {
112 112
     .header = old_dirac_header,
113 113
     .gptopts = old_dirac_gptopts,
114 114
     .granule_is_start = 1,
115
+    .nb_header = 1,
115 116
 };
... ...
@@ -88,11 +88,13 @@ old_flac_header (AVFormatContext * s, int idx)
88 88
 const struct ogg_codec ff_flac_codec = {
89 89
     .magic = "\177FLAC",
90 90
     .magicsize = 5,
91
-    .header = flac_header
91
+    .header = flac_header,
92
+    .nb_header = 2,
92 93
 };
93 94
 
94 95
 const struct ogg_codec ff_old_flac_codec = {
95 96
     .magic = "fLaC",
96 97
     .magicsize = 4,
97
-    .header = old_flac_header
98
+    .header = old_flac_header,
99
+    .nb_header = 0,
98 100
 };
... ...
@@ -156,6 +156,7 @@ const struct ogg_codec ff_ogm_video_codec = {
156 156
     .header = ogm_header,
157 157
     .packet = ogm_packet,
158 158
     .granule_is_start = 1,
159
+    .nb_header = 2,
159 160
 };
160 161
 
161 162
 const struct ogg_codec ff_ogm_audio_codec = {
... ...
@@ -164,6 +165,7 @@ const struct ogg_codec ff_ogm_audio_codec = {
164 164
     .header = ogm_header,
165 165
     .packet = ogm_packet,
166 166
     .granule_is_start = 1,
167
+    .nb_header = 2,
167 168
 };
168 169
 
169 170
 const struct ogg_codec ff_ogm_text_codec = {
... ...
@@ -172,6 +174,7 @@ const struct ogg_codec ff_ogm_text_codec = {
172 172
     .header = ogm_header,
173 173
     .packet = ogm_packet,
174 174
     .granule_is_start = 1,
175
+    .nb_header = 2,
175 176
 };
176 177
 
177 178
 const struct ogg_codec ff_ogm_old_codec = {
... ...
@@ -180,4 +183,5 @@ const struct ogg_codec ff_ogm_old_codec = {
180 180
     .header = ogm_dshow_header,
181 181
     .packet = ogm_packet,
182 182
     .granule_is_start = 1,
183
+    .nb_header = 1,
183 184
 };
... ...
@@ -86,4 +86,5 @@ const struct ogg_codec ff_skeleton_codec = {
86 86
     .magic = "fishead",
87 87
     .magicsize = 8,
88 88
     .header = skeleton_header,
89
+    .nb_header = 0,
89 90
 };
... ...
@@ -122,5 +122,6 @@ const struct ogg_codec ff_speex_codec = {
122 122
     .magic = "Speex   ",
123 123
     .magicsize = 8,
124 124
     .header = speex_header,
125
-    .packet = speex_packet
125
+    .packet = speex_packet,
126
+    .nb_header = 2,
126 127
 };
... ...
@@ -150,5 +150,6 @@ const struct ogg_codec ff_theora_codec = {
150 150
     .magic = "\200theora",
151 151
     .magicsize = 7,
152 152
     .header = theora_header,
153
-    .gptopts = theora_gptopts
153
+    .gptopts = theora_gptopts,
154
+    .nb_header = 3,
154 155
 };
... ...
@@ -359,4 +359,5 @@ const struct ogg_codec ff_vorbis_codec = {
359 359
     .magicsize = 7,
360 360
     .header = vorbis_header,
361 361
     .packet = vorbis_packet,
362
+    .nb_header = 3,
362 363
 };