Package: libtag1c2a Version: 1.4-4 Severity: important Tags: patch
I have many mp3 files which have id3v2 tags with zero-sized frames in them; that is, the 4 byte frame identfier, 4 nulls, and 2 flag bytes. This isn't an issue with other tag processing apps/libs, but taglib fails to parse the tag after such a frame. So only the data to the first such frame is processed, which leads to an incomplete display of file information in the various players using taglib. The attached patch fixes the issue. -- System Information: Debian Release: 4.0 APT prefers unstable APT policy: (500, 'unstable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.18-ck1 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Versions of packages libtag1c2a depends on: hi libc6 2.3.6-7 GNU C Library: Shared libraries hi libgcc1 1:4.1.1-21 GCC support library hi libstdc++6 4.1.1-21 The GNU Standard C++ Library v3 hi zlib1g 1:1.2.3-11 compression library - runtime libtag1c2a recommends no packages. -- no debconf information
diff -ruN taglib-1.4/taglib/mpeg/id3v2/frames/textidentificationframe.cpp taglib-1.4-mine/taglib/mpeg/id3v2/frames/textidentificationframe.cpp --- taglib-1.4/taglib/mpeg/id3v2/frames/textidentificationframe.cpp 2005-05-17 22:17:26.000000000 +0200 +++ taglib-1.4-mine/taglib/mpeg/id3v2/frames/textidentificationframe.cpp 2007-03-05 04:27:39.265744795 +0100 @@ -94,6 +94,10 @@ void TextIdentificationFrame::parseFields(const ByteVector &data) { + if(data.size() == 0) { + return; + } + // read the string data type (the first byte of the field data) d->textEncoding = String::Type(data[0]); diff -ruN taglib-1.4/taglib/mpeg/id3v2/id3v2framefactory.cpp taglib-1.4-mine/taglib/mpeg/id3v2/id3v2framefactory.cpp --- taglib-1.4/taglib/mpeg/id3v2/id3v2framefactory.cpp 2005-07-25 23:10:42.000000000 +0200 +++ taglib-1.4-mine/taglib/mpeg/id3v2/id3v2framefactory.cpp 2007-03-05 03:58:00.714125739 +0100 @@ -72,7 +72,7 @@ // 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) || header->frameSize() <= 0) { + if(!frameID.size() == (version < 3 ? 3 : 4) || header->frameSize() < 0) { delete header; return 0; } diff -ruN taglib-1.4/taglib/mpeg/id3v2/id3v2tag.cpp taglib-1.4-mine/taglib/mpeg/id3v2/id3v2tag.cpp --- taglib-1.4/taglib/mpeg/id3v2/id3v2tag.cpp 2005-07-25 23:10:42.000000000 +0200 +++ taglib-1.4-mine/taglib/mpeg/id3v2/id3v2tag.cpp 2007-03-05 03:57:12.625436331 +0100 @@ -438,7 +438,7 @@ // Checks to make sure that frame parsed correctly. - if(frame->size() <= 0) { + if(frame->size() < 0) { delete frame; return; }