From 85df71ea2ed35c3896ff7b35b3186157d27a3940 Mon Sep 17 00:00:00 2001 From: Peter van Hardenberg Date: Tue, 1 Dec 2009 09:11:21 +0000 Subject: [PATCH] When decoding syncsafe integers, assume non-syncsafe integers are written by buggy software and treat them as normal integers. 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 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/taglib/mpeg/id3v2/id3v2synchdata.cpp b/taglib/mpeg/id3v2/id3v2synchdata.cpp index 17503ba5..2d341f13 100644 --- a/taglib/mpeg/id3v2/id3v2synchdata.cpp +++ b/taglib/mpeg/id3v2/id3v2synchdata.cpp @@ -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; }