mirror of
https://github.com/taglib/taglib.git
synced 2025-06-03 17:18:11 -04:00
Fix ID3v2::UniqueFileIdentifier frame parsing.
According to the spec, the identifier contains arbitrary binary data (which includes \0). That means splitting it on \0 and checking if we have only two parts is wrong, because it rejects valid frames. git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@735109 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
This commit is contained in:
parent
41bc6f0686
commit
2462905fe0
@ -24,6 +24,7 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include <tbytevectorlist.h>
|
||||
#include <tdebug.h>
|
||||
|
||||
#include "uniquefileidentifierframe.h"
|
||||
|
||||
@ -88,13 +89,14 @@ String UniqueFileIdentifierFrame::toString() const
|
||||
|
||||
void UniqueFileIdentifierFrame::parseFields(const ByteVector &data)
|
||||
{
|
||||
ByteVectorList fields = ByteVectorList::split(data, char(0));
|
||||
|
||||
if(fields.size() != 2)
|
||||
if(data.size() < 1) {
|
||||
debug("An UFID frame must contain at least 1 byte.");
|
||||
return;
|
||||
}
|
||||
|
||||
d->owner = fields.front();
|
||||
d->identifier = fields.back();
|
||||
int pos = 0;
|
||||
d->owner = readStringField(data, String::Latin1, &pos);
|
||||
d->identifier = data.mid(pos);
|
||||
}
|
||||
|
||||
ByteVector UniqueFileIdentifierFrame::renderFields() const
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <id3v2tag.h>
|
||||
#include <mpegfile.h>
|
||||
#include <id3v2frame.h>
|
||||
#include <uniquefileidentifierframe.h>
|
||||
#include <textidentificationframe.h>
|
||||
#include <attachedpictureframe.h>
|
||||
#include <generalencapsulatedobjectframe.h>
|
||||
@ -34,6 +35,8 @@ class TestID3v2 : public CppUnit::TestFixture
|
||||
CPPUNIT_TEST(testParseAPIC);
|
||||
CPPUNIT_TEST(testParseGEOB);
|
||||
CPPUNIT_TEST(testParseRelativeVolumeFrame);
|
||||
CPPUNIT_TEST(testParseUniqueFileIdentifierFrame);
|
||||
CPPUNIT_TEST(testParseEmptyUniqueFileIdentifierFrame);
|
||||
CPPUNIT_TEST(testBrokenFrame1);
|
||||
//CPPUNIT_TEST(testItunes24FrameSize);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
@ -135,6 +138,34 @@ public:
|
||||
f.peakVolume(ID3v2::RelativeVolumeFrame::FrontRight).peakVolume);
|
||||
}
|
||||
|
||||
void testParseUniqueFileIdentifierFrame()
|
||||
{
|
||||
ID3v2::UniqueFileIdentifierFrame f(
|
||||
ByteVector("UFID" // Frame ID
|
||||
"\x00\x00\x00\x09" // Frame size
|
||||
"\x00\x00" // Frame flags
|
||||
"owner\x00" // Owner identifier
|
||||
"\x00\x01\x02", 19)); // Identifier
|
||||
CPPUNIT_ASSERT_EQUAL(String("owner"),
|
||||
f.owner());
|
||||
CPPUNIT_ASSERT_EQUAL(ByteVector("\x00\x01\x02", 3),
|
||||
f.identifier());
|
||||
}
|
||||
|
||||
void testParseEmptyUniqueFileIdentifierFrame()
|
||||
{
|
||||
ID3v2::UniqueFileIdentifierFrame f(
|
||||
ByteVector("UFID" // Frame ID
|
||||
"\x00\x00\x00\x01" // Frame size
|
||||
"\x00\x00" // Frame flags
|
||||
"\x00" // Owner identifier
|
||||
"", 11)); // Identifier
|
||||
CPPUNIT_ASSERT_EQUAL(String(),
|
||||
f.owner());
|
||||
CPPUNIT_ASSERT_EQUAL(ByteVector(),
|
||||
f.identifier());
|
||||
}
|
||||
|
||||
/*void testItunes24FrameSize()
|
||||
{
|
||||
MPEG::File f("data/005411.id3", false);
|
||||
|
Loading…
x
Reference in New Issue
Block a user