[FFmpeg-cvslog] avformat/3dostr: make probing more robust

Paul B Mahol git at videolan.org
Fri Sep 18 00:48:22 EEST 2020


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Thu Sep 17 23:19:18 2020 +0200| [3ac45bf66561a667260cac37223c0393f7333fca] | committer: Paul B Mahol

avformat/3dostr: make probing more robust

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3ac45bf66561a667260cac37223c0393f7333fca
---

 libavformat/3dostr.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 45 insertions(+), 5 deletions(-)

diff --git a/libavformat/3dostr.c b/libavformat/3dostr.c
index 3ec3c4393e..2d92b46570 100644
--- a/libavformat/3dostr.c
+++ b/libavformat/3dostr.c
@@ -19,17 +19,57 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/intreadwrite.h"
 #include "avformat.h"
 #include "internal.h"
 
 static int threedostr_probe(const AVProbeData *p)
 {
-    if (memcmp(p->buf, "CTRL", 4) &&
-        memcmp(p->buf, "SHDR", 4) &&
-        memcmp(p->buf, "SNDS", 4))
-        return 0;
+    for (int i = 0; i < p->buf_size;) {
+        unsigned chunk = AV_RL32(p->buf + i);
+        unsigned size  = AV_RB32(p->buf + i + 4);
 
-    return AVPROBE_SCORE_MAX / 3 * 2;
+        i += 8;
+        if (size < 8 || p->buf_size - i < size)
+            return 0;
+
+        size -= 8;
+        switch (chunk) {
+        case MKTAG('C','T','R','L'):
+            break;
+        case MKTAG('S','N','D','S'):
+            if (size < 56)
+                return 0;
+            i += 8;
+            if (AV_RL32(p->buf + i) != MKTAG('S','H','D','R'))
+                return 0;
+            i += 28;
+
+            if (AV_RB32(p->buf + i) <= 0)
+                return 0;
+            i += 4;
+            if (AV_RB32(p->buf + i) <= 0)
+                return 0;
+            i += 4;
+            if (AV_RL32(p->buf + i) == MKTAG('S','D','X','2'))
+                return AVPROBE_SCORE_MAX;
+            else
+                return 0;
+            break;
+        case MKTAG('S','H','D','R'):
+            if (size > 0x78) {
+                i += 0x78;
+                size -= 0x78;
+            }
+            break;
+        default:
+            break;
+        }
+
+        i += size;
+    }
+
+    return 0;
 }
 
 static int threedostr_read_header(AVFormatContext *s)



More information about the ffmpeg-cvslog mailing list