Skip to content

Commit 397b6c1

Browse files
sboothufleisch
andauthored
Add check for ID3v2 frame data length (#1300)
Also fix some wrong frame sizes in the unit tests. --------- Co-authored-by: Urs Fleisch <ufleisch@users.sourceforge.net>
1 parent 51f431c commit 397b6c1

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

taglib/mpeg/id3v2/id3v2frame.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,13 @@ ByteVector Frame::fieldData(const ByteVector &frameData) const
295295
frameDataLength = SynchData::toUInt(frameData.mid(headerSize, 4));
296296
frameDataOffset += 4;
297297
}
298+
if(frameData.size() >= headerSize &&
299+
frameDataOffset + frameDataLength > frameData.size()) {
300+
// The first check is needed because some "dual purpose" frame constructors
301+
// call this method with only the frame ID, i.e. without a complete header.
302+
debug("Invalid frame data length");
303+
return ByteVector();
304+
}
298305

299306
if(zlib::isAvailable() && d->header->compression() && !d->header->encryption()) {
300307
if(frameData.size() <= frameDataOffset) {

tests/test_id3v2.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,13 @@ class TestID3v2 : public CppUnit::TestFixture
234234
f.setData(multiBomBeData);
235235
CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString());
236236

237-
ByteVector singleBomLeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xff\xfe"
237+
ByteVector singleBomLeData("TPE1\x00\x00\x00\x11\x00\x00\x01\xff\xfe"
238238
"F\0o\0o\0\0\0"
239239
"B\0a\0r\0", 27);
240240
f.setData(singleBomLeData);
241241
CPPUNIT_ASSERT_EQUAL(String("Foo Bar"), f.toString());
242242

243-
ByteVector singleBomBeData("TPE1\x00\x00\x00\x13\x00\x00\x01\xfe\xff"
243+
ByteVector singleBomBeData("TPE1\x00\x00\x00\x11\x00\x00\x01\xfe\xff"
244244
"\0F\0o\0o\0\0"
245245
"\0B\0a\0r", 27);
246246
f.setData(singleBomBeData);
@@ -281,7 +281,7 @@ class TestID3v2 : public CppUnit::TestFixture
281281
void testParseAPIC_UTF16_BOM()
282282
{
283283
ID3v2::AttachedPictureFrame f(ByteVector(
284-
"\x41\x50\x49\x43\x00\x02\x0c\x59\x00\x00\x01\x69\x6d\x61\x67\x65"
284+
"\x41\x50\x49\x43\x00\x00\x00\x26\x00\x00\x01\x69\x6d\x61\x67\x65"
285285
"\x2f\x6a\x70\x65\x67\x00\x00\xfe\xff\x00\x63\x00\x6f\x00\x76\x00"
286286
"\x65\x00\x72\x00\x2e\x00\x6a\x00\x70\x00\x67\x00\x00\xff\xd8\xff",
287287
16 * 3));
@@ -668,7 +668,7 @@ class TestID3v2 : public CppUnit::TestFixture
668668
{
669669
ID3v2::SynchronizedLyricsFrame f(
670670
ByteVector("SYLT" // Frame ID
671-
"\x00\x00\x00\x21" // Frame size
671+
"\x00\x00\x00\x1e" // Frame size
672672
"\x00\x00" // Frame flags
673673
"\x00" // Text encoding
674674
"eng" // Language
@@ -1424,7 +1424,7 @@ class TestID3v2 : public CppUnit::TestFixture
14241424

14251425
auto chapterData =
14261426
ByteVector("CHAP" // Frame ID
1427-
"\x00\x00\x00\x20" // Frame size
1427+
"\x00\x00\x00\x12" // Frame size
14281428
"\x00\x00" // Frame flags
14291429
"\x43\x00" // Element ID ("C")
14301430
"\x00\x00\x00\x03" // Start time
@@ -1447,7 +1447,10 @@ class TestID3v2 : public CppUnit::TestFixture
14471447
CPPUNIT_ASSERT(static_cast<unsigned int>(0x03) == f1.endOffset());
14481448
CPPUNIT_ASSERT(static_cast<unsigned int>(0x00) == f1.embeddedFrameList().size());
14491449

1450-
ID3v2::ChapterFrame f2(&header, chapterData + embeddedFrameData);
1450+
auto chapWithTit2Data = chapterData + embeddedFrameData;
1451+
// Adapt the frame size for the added embedded frame data.
1452+
chapWithTit2Data[7] = static_cast<char>(chapterData[7] + embeddedFrameData.size());
1453+
ID3v2::ChapterFrame f2(&header, chapWithTit2Data);
14511454

14521455
CPPUNIT_ASSERT_EQUAL(ByteVector("C"), f2.elementID());
14531456
CPPUNIT_ASSERT(static_cast<unsigned int>(0x03) == f2.startTime());

0 commit comments

Comments
 (0)