[FFmpeg-cvslog] flvdec: Add sanity checking of the last packet size
Martin Storsjö
git at videolan.org
Wed Jan 27 19:44:21 CET 2016
ffmpeg | branch: master | Martin Storsjö <martin at martin.st> | Tue Jan 19 10:04:32 2016 +0200| [e4eb13ca77624401ea7cef1ed6ad8e2d13fd2063] | committer: Martin Storsjö
flvdec: Add sanity checking of the last packet size
For http, this avoids spurious warnings about failed requests (e.g.
HTTP error 416 Requested Range Not Satisfiable), if the last packet
is truncated and the size read is bogus.
Signed-off-by: Martin Storsjö <martin at martin.st>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e4eb13ca77624401ea7cef1ed6ad8e2d13fd2063
---
libavformat/flvdec.c | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c
index cf9769a..8b0d201 100644
--- a/libavformat/flvdec.c
+++ b/libavformat/flvdec.c
@@ -846,13 +846,15 @@ skip:
const int64_t fsize = avio_size(s->pb);
avio_seek(s->pb, fsize - 4, SEEK_SET);
size = avio_rb32(s->pb);
- // Seek to the start of the last FLV tag at position (fsize - 4 - size)
- // but skip the byte indicating the type.
- avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
- if (size == avio_rb24(s->pb) + 11) {
- uint32_t ts = avio_rb24(s->pb);
- ts |= avio_r8(s->pb) << 24;
- s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
+ if (size > 0 && size < fsize) {
+ // Seek to the start of the last FLV tag at position (fsize - 4 - size)
+ // but skip the byte indicating the type.
+ avio_seek(s->pb, fsize - 3 - size, SEEK_SET);
+ if (size == avio_rb24(s->pb) + 11) {
+ uint32_t ts = avio_rb24(s->pb);
+ ts |= avio_r8(s->pb) << 24;
+ s->duration = ts * (int64_t)AV_TIME_BASE / 1000;
+ }
}
avio_seek(s->pb, pos, SEEK_SET);
flv->searched_for_end = 1;
More information about the ffmpeg-cvslog
mailing list