]> granicus.if.org Git - taglib/commitdiff
When decoding syncsafe integers, assume non-syncsafe integers are written by buggy...
authorPeter van Hardenberg <pvh@pvh.ca>
Tue, 1 Dec 2009 09:11:21 +0000 (09:11 +0000)
committerPeter van Hardenberg <pvh@pvh.ca>
Tue, 1 Dec 2009 09:11:21 +0000 (09:11 +0000)
From Songbird bug 12964, original author Mike Smith (msmith@songbirdnest.com)

git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1056922 283d02a7-25f6-0310-bc7c-ecb5cbfe19da

taglib/mpeg/id3v2/id3v2synchdata.cpp

index 17503ba5437a5c308689dc0eb567070940944a28..2d341f1383e15696e5d85487c833c039878dfdb2 100644 (file)
@@ -33,10 +33,26 @@ using namespace ID3v2;
 TagLib::uint SynchData::toUInt(const ByteVector &data)
 {
   uint sum = 0;
+  bool notsyncsafe = false;
   int last = data.size() > 4 ? 3 : data.size() - 1;
 
-  for(int i = 0; i <= last; i++)
+  for(int i = 0; i <= last; i++) {
+    if (data[i] & 0x80) {
+      notsyncsafe = true;
+      break;
+    }
+
     sum |= (data[i] & 0x7f) << ((last - i) * 7);
+  }
+
+  if (notsyncsafe) {
+    /* Invalid data; assume this was created by some buggy software that just
+     * put normal integers here rather than syncsafe ones, and try it that 
+     * way... */
+    sum = 0;
+    for(int i = 0; i <= last; i++)
+      sum |= data[i] << ((last - i) * 8);
+  }
 
   return sum;
 }