diff --git a/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp b/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp index 50720359..f7971250 100644 --- a/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp +++ b/taglib/mpeg/id3v2/frames/tableofcontentsframe.cpp @@ -272,9 +272,9 @@ void TableOfContentsFrame::parseFields(const ByteVector &data) int pos = 0; unsigned int embPos = 0; d->elementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); - d->isTopLevel = (data.at(pos) & 2) > 0; - d->isOrdered = (data.at(pos++) & 1) > 0; - unsigned int entryCount = data.at(pos++); + d->isTopLevel = (data.at(pos) & 2) != 0; + d->isOrdered = (data.at(pos++) & 1) != 0; + unsigned int entryCount = static_cast(data.at(pos++)); for(unsigned int i = 0; i < entryCount; i++) { ByteVector childElementID = readStringField(data, String::Latin1, &pos).data(String::Latin1); d->childElements.append(childElementID); diff --git a/tests/data/toc_many_children.mp3 b/tests/data/toc_many_children.mp3 new file mode 100644 index 00000000..168c4798 Binary files /dev/null and b/tests/data/toc_many_children.mp3 differ diff --git a/tests/test_id3v2.cpp b/tests/test_id3v2.cpp index 93a3d2c2..4f58bdd6 100644 --- a/tests/test_id3v2.cpp +++ b/tests/test_id3v2.cpp @@ -118,6 +118,7 @@ class TestID3v2 : public CppUnit::TestFixture CPPUNIT_TEST(testShrinkPadding); CPPUNIT_TEST(testEmptyFrame); CPPUNIT_TEST(testDuplicateTags); + CPPUNIT_TEST(testParseTOCFrameWithManyChildren); CPPUNIT_TEST_SUITE_END(); public: @@ -1217,6 +1218,12 @@ public: } } + void testParseTOCFrameWithManyChildren() + { + MPEG::File f(TEST_FILE_PATH_C("toc_many_children.mp3")); + CPPUNIT_ASSERT(f.isValid()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestID3v2);