diff --git a/libavformat/avidec.c b/libavformat/avidec.c index f428fabad2..4cf99bb6b9 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -48,6 +48,7 @@ typedef struct AVIStream { typedef struct { int64_t riff_end; int64_t movi_end; + int64_t fsize; offset_t movi_list; int index_loaded; int is_odml; @@ -226,6 +227,10 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) if (get_riff(avi, pb) < 0) return -1; + avi->fsize = url_fsize(pb); + if(avi->fsize<=0) + avi->fsize= avi->riff_end; + /* first list tag */ stream_index = -1; codec_type = -1; @@ -690,7 +695,7 @@ resync: n= 100; //invalid stream id } //av_log(NULL, AV_LOG_DEBUG, "%X %X %X %X %X %X %X %X %"PRId64" %d %d\n", d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], i, size, n); - if(i + size > avi->movi_end || d[0]<0) + if(i + size > avi->fsize || d[0]<0) continue; //parse ix## @@ -755,7 +760,7 @@ resync: if ( d[0] >= '0' && d[0] <= '9' && d[1] >= '0' && d[1] <= '9' && ((d[2] == 'p' && d[3] == 'c')) - && n < s->nb_streams && i + size <= avi->movi_end) { + && n < s->nb_streams && i + size <= avi->fsize) { AVStream *st; int first, clr, flags, k, p;