]> granicus.if.org Git - taglib/commitdiff
Reverse the version check, similarly to what mp4v2 does
authorLukáš Lalinský <lalinsky@gmail.com>
Tue, 10 Jan 2012 16:18:20 +0000 (17:18 +0100)
committerLukáš Lalinský <lalinsky@gmail.com>
Tue, 10 Jan 2012 16:18:20 +0000 (17:18 +0100)
taglib/mp4/mp4properties.cpp

index 5dc876734df0192a55d362bb8dcd9ac7f1551ca1..d2d04167c472b24c144cc752ad5b131826ca9cf7 100644 (file)
@@ -90,15 +90,24 @@ MP4::Properties::Properties(File *file, MP4::Atoms *atoms, ReadStyle style)
 
   file->seek(mdhd->offset);
   data = file->readBlock(mdhd->length);
-  if(data[8] == 0) {
-    unsigned int unit = data.mid(20, 4).toUInt();
-    unsigned int length = data.mid(24, 4).toUInt();
-    d->length = length / unit;
-  }
-  else {
+  uint version = data[8];
+  if(version == 1) {
+    if (data.size() < 36 + 8) {
+      debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected");
+      return;
+    }
     long long unit = data.mid(28, 8).toLongLong();
     long long length = data.mid(36, 8).toLongLong();
-    d->length = int(length / unit);
+    d->length = unit ? int(length / unit) : 0;
+  }
+  else {
+    if (data.size() < 24 + 4) {
+      debug("MP4: Atom 'trak.mdia.mdhd' is smaller than expected");
+      return;
+    }
+    unsigned int unit = data.mid(20, 4).toUInt();
+    unsigned int length = data.mid(24, 4).toUInt();
+    d->length = unit ? length / unit : 0;
   }
 
   MP4::Atom *atom = trak->find("mdia", "minf", "stbl", "stsd");