Module: libav Branch: master Commit: 7751e4693dd10ec98c20fbd9887233b575034272
Author: Luca Barbato <lu_z...@gentoo.org> Committer: Luca Barbato <lu_z...@gentoo.org> Date: Thu Sep 20 01:01:43 2012 +0200 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. --- libavformat/oggdec.c | 13 ++++++++++++- libavformat/oggdec.h | 5 +++++ libavformat/oggparsecelt.c | 1 + libavformat/oggparsedirac.c | 2 ++ libavformat/oggparseflac.c | 6 ++++-- libavformat/oggparseogm.c | 4 ++++ libavformat/oggparseskeleton.c | 1 + libavformat/oggparsespeex.c | 3 ++- libavformat/oggparsetheora.c | 3 ++- libavformat/oggparsevorbis.c | 1 + 10 files changed, 34 insertions(+), 5 deletions(-) diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index e04a4e7..c8b2a85 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -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; diff --git a/libavformat/oggdec.h b/libavformat/oggdec.h index 184a628..fa8a5bc 100644 --- a/libavformat/oggdec.h +++ b/libavformat/oggdec.h @@ -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; }; diff --git a/libavformat/oggparsecelt.c b/libavformat/oggparsecelt.c index 253ef76..0deccc2 100644 --- a/libavformat/oggparsecelt.c +++ b/libavformat/oggparsecelt.c @@ -93,4 +93,5 @@ const struct ogg_codec ff_celt_codec = { .magic = "CELT ", .magicsize = 8, .header = celt_header, + .nb_header = 2, }; diff --git a/libavformat/oggparsedirac.c b/libavformat/oggparsedirac.c index cc6f768..55a0b59 100644 --- a/libavformat/oggparsedirac.c +++ b/libavformat/oggparsedirac.c @@ -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, }; diff --git a/libavformat/oggparseflac.c b/libavformat/oggparseflac.c index 9860a0e..f59b400 100644 --- a/libavformat/oggparseflac.c +++ b/libavformat/oggparseflac.c @@ -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, }; diff --git a/libavformat/oggparseogm.c b/libavformat/oggparseogm.c index b52969f..7b3cda2 100644 --- a/libavformat/oggparseogm.c +++ b/libavformat/oggparseogm.c @@ -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, }; diff --git a/libavformat/oggparseskeleton.c b/libavformat/oggparseskeleton.c index 62dd14d..a49d30b 100644 --- a/libavformat/oggparseskeleton.c +++ b/libavformat/oggparseskeleton.c @@ -86,4 +86,5 @@ const struct ogg_codec ff_skeleton_codec = { .magic = "fishead", .magicsize = 8, .header = skeleton_header, + .nb_header = 0, }; diff --git a/libavformat/oggparsespeex.c b/libavformat/oggparsespeex.c index e4dfec5..11b50d5 100644 --- a/libavformat/oggparsespeex.c +++ b/libavformat/oggparsespeex.c @@ -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, }; diff --git a/libavformat/oggparsetheora.c b/libavformat/oggparsetheora.c index 021d3ae..df7a89c 100644 --- a/libavformat/oggparsetheora.c +++ b/libavformat/oggparsetheora.c @@ -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, }; diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c index f762c94..396a3e3 100644 --- a/libavformat/oggparsevorbis.c +++ b/libavformat/oggparsevorbis.c @@ -359,4 +359,5 @@ const struct ogg_codec ff_vorbis_codec = { .magicsize = 7, .header = vorbis_header, .packet = vorbis_packet, + .nb_header = 3, }; _______________________________________________ libav-commits mailing list libav-commits@libav.org https://lists.libav.org/mailman/listinfo/libav-commits