[FFmpeg-devel] [PATCH] mov.c: fix handling of seek return in read_mfra

Mika Raento mikie at iki.fi
Sat Nov 15 07:59:56 CET 2014


this would cause mfra to be ignored in files larger than 2G
---
 libavformat/mov.c | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index 6ba7b96..506c1a6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3820,35 +3820,39 @@ static int mov_read_mfra(MOVContext *c, AVIOContext *f)
     int64_t stream_size = avio_size(f);
     int64_t original_pos = avio_tell(f);
     int32_t mfra_size;
-    int ret = -1;
-    if ((ret = avio_seek(f, stream_size - 4, SEEK_SET)) < 0) goto fail;
+    // we return 0 or AV_ERROR, both fit in 32bits, but we check intermediate
+    // calls that have 64 bits
+    int64_t ret = -1;
+    if ((ret = avio_seek(f, stream_size - 4, SEEK_SET)) < 0) {
+        goto fail;
+    }
     mfra_size = avio_rb32(f);
     if (mfra_size < 0 || mfra_size > stream_size) {
         av_log(c->fc, AV_LOG_DEBUG, "doesn't look like mfra (unreasonable size)\n");
-        ret = -1;
         goto fail;
     }
-    if ((ret = avio_seek(f, -mfra_size, SEEK_CUR)) < 0) goto fail;
+    if ((ret = avio_seek(f, -mfra_size, SEEK_CUR)) < 0) {
+        goto fail;
+    }
     if (avio_rb32(f) != mfra_size) {
         av_log(c->fc, AV_LOG_DEBUG, "doesn't look like mfra (size mismatch)\n");
-        ret = -1;
         goto fail;
     }
     if (avio_rb32(f) != MKBETAG('m', 'f', 'r', 'a')) {
         av_log(c->fc, AV_LOG_DEBUG, "doesn't look like mfra (tag mismatch)\n");
         goto fail;
     }
+    ret = 0;
     av_log(c->fc, AV_LOG_VERBOSE, "stream has mfra\n");
     while (!read_tfra(c, f)) {
         /* Empty */
     }
 fail:
     ret = avio_seek(f, original_pos, SEEK_SET);
-    if (ret < 0)
+    if (ret < 0) {
         av_log(c->fc, AV_LOG_ERROR,
                "failed to seek back after looking for mfra\n");
-    else
-        ret = 0;
+    }
     return ret;
 }
 
-- 
1.9.3 (Apple Git-50)



More information about the ffmpeg-devel mailing list