Empty WCOM fields in id3v2 tags
Mike Dawson
mikeesn at charter.net
Wed Dec 19 21:18:34 UTC 2012
Hi All,
We've ran across quite a few tracks with empty WCOM frames in id3v2 tags.
- Contents of WCOM:
* frameID=WCOM
* frameSize = 0
* d->dataLengthIndicator = false
Taglib rejects the frame as invalid in id3v2framefactory.cpp and id3v2tag.cpp and invalidates the complete tag.
According to //id3.org/id3v2.3.0 the frame is actually illegal, so taglibs reaction is technically correct.
3.3. ID3v2 frame overview
A tag must contain at least one frame. A frame must be at least 1 byte big, excluding the
header.
However, many other parsers skip the bad frame and continue parsing the tag, for instance
Winamp, Mp3tag, iTunes. Would a better method be to check for a valid field following the empty field,
and then continue parsing?
Although the same issue exists for the code in taglib.git at master, for illustration of the problem and not a suggested fix,
the following two patches to version 1.7 allow the id3v2 tags with empty WCOM fields to be parsed:
===========================
diff --git a/taglib-1.7/taglib/mpeg/id3v2/id3v2framefactory.cpp b/taglib-1.7/taglib/mpeg/id3v2/id3v2framefactory.cpp
index c531aaa..4fab414 100755
--- a/taglib-1.7/taglib/mpeg/id3v2/id3v2framefactory.cpp
+++ b/taglib-1.7/taglib/mpeg/id3v2/id3v2framefactory.cpp
@@ -105,9 +105,12 @@ Frame *FrameFactory::createFrame(const ByteVector &origData, Header *tagHeader)
// A quick sanity check -- make sure that the frameID is 4 uppercase Latin1
// characters. Also make sure that there is data in the frame.
-
- if(!frameID.size() == (version < 3 ? 3 : 4) ||
+//MED
+/* if(!frameID.size() == (version < 3 ? 3 : 4) ||
header->frameSize() <= uint(header->dataLengthIndicator() ? 4 : 0) ||
+ */
+ if(frameID.size() != (version < 3 ? 3 : 4) || /*1.8 fix*/
+ (header->dataLengthIndicator() && (header->frameSize() <= uint(4)) ) || /*Empty URL fix*/
header->frameSize() > data.size())
{
delete header;
=======================
diff --git a/taglib-1.7/taglib/mpeg/id3v2/id3v2tag.cpp b/taglib-1.7/taglib/mpeg/id3v2/id3v2tag.cpp
index 7e8012b..3fb5148 100755
--- a/taglib-1.7/taglib/mpeg/id3v2/id3v2tag.cpp
+++ b/taglib-1.7/taglib/mpeg/id3v2/id3v2tag.cpp
@@ -446,12 +446,14 @@ void ID3v2::Tag::parse(const ByteVector &origData)
return;
// Checks to make sure that frame parsed correctly.
-
- if(frame->size() <= 0) {
+//MED - empty URL fix
+//Add check somehow for frame.d.header.d.dataLengthIndicator()
+// if(frame->size() <=0 && frame.d.header.d.dataLengthIndicator()
+/* if(frame->size() <= 0) {
delete frame;
return;
}
-
+*/
frameDataPosition += frame->size() + Frame::headerSize(d->header.majorVersion());
addFrame(frame);
}
Thanks for any help.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/taglib-devel/attachments/20121219/65962369/attachment.html>
More information about the taglib-devel
mailing list