]> granicus.if.org Git - taglib/commitdiff
Fix ID3v2::UniqueFileIdentifier frame parsing.
authorLukáš Lalinský <lalinsky@gmail.com>
Sat, 10 Nov 2007 22:20:33 +0000 (22:20 +0000)
committerLukáš Lalinský <lalinsky@gmail.com>
Sat, 10 Nov 2007 22:20:33 +0000 (22:20 +0000)
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

taglib/mpeg/id3v2/frames/uniquefileidentifierframe.cpp
tests/test_id3v2.cpp

index 5066e37efdf5caa4a6179e2cbe515ae7d862c6a0..f9ba03684c835338f0d968392fd57c2a5a9d671b 100644 (file)
@@ -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
index e4ead22af68755bb6f8b3ea70cf1cf358620dff5..bfdf84bbb244e1ff991f245a6cfbc2620642220f 100644 (file)
@@ -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);