diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2012-02-04 15:27:34 +0100 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2012-02-04 19:13:29 +0100 |
commit | d7b542ae294aaf818f2a00c5606e009cf931e77c (patch) | |
tree | 871f873b3b349a9bcaf19fa6fa88a290ee74b40c /libavformat/oggdec.c | |
parent | 7f8027b76f1bdce7452d02513fc179cca20d8867 (diff) | |
download | ffmpeg-d7b542ae294aaf818f2a00c5606e009cf931e77c.tar.gz |
Fix potential infinite discard loop.
Fixes trac issue #438.
Seeking in that sample would cause ogg_read_timestamp to fail
because ogg_packet would go into a state where all packets
of stream 1 would be discarded until the end of the stream.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
Diffstat (limited to 'libavformat/oggdec.c')
-rw-r--r-- | libavformat/oggdec.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 3a1abc085f..4280f8f842 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -282,6 +282,9 @@ static int ogg_read_page(AVFormatContext *s, int *str) if (flags & OGG_FLAG_CONT || os->incomplete){ if (!os->psize){ + // If this is the very first segment we started + // playback in the middle of a continuation packet. + // Discard it since we missed the start of it. while (os->segp < os->nsegs){ int seg = os->segments[os->segp++]; os->pstart += seg; @@ -368,7 +371,11 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, if (!complete && os->segp == os->nsegs){ ogg->curidx = -1; - os->incomplete = 1; + // Do not set incomplete for empty packets. + // Together with the code in ogg_read_page + // that discards all continuation of empty packets + // we would get an infinite loop. + os->incomplete = !!os->psize; } }while (!complete); |