From 9b995544e4ca27c4162638b3048b1633cab4048b Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Sat, 14 May 2016 09:58:19 +0900 Subject: [PATCH] Fix reading table of contents frames with a lot of children. --- .../mpeg/id3v2/frames/tableofcontentsframe.cpp | 6 +++--- tests/data/toc_many_children.mp3 | Bin 0 -> 11525 bytes tests/test_id3v2.cpp | 7 +++++++ 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 tests/data/toc_many_children.mp3 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 0000000000000000000000000000000000000000..168c47981fb866c759a5a845175977b95ce01b23 GIT binary patch literal 11525 zcmeI2ZHQE57=|Bn)h(^8EVV4x+RD%Myyu*mIa3je23i|QY$PFMwT986n{6RfU=$%y zAW>u>R3PCGAqxqih=mL!j3WFYArv80Bz;hX^nu;?u-Lgc&~L`F70AoBDB8}Az)*{~&%v4ao~(s+=?gFGJ8;z2zg zG~z)K51R2Hv|n0ZJLroCef6L(AN2Ku76fewS`oA()s9p5$h0HVj!Zi;?Z~tv(~e9#GVRE;BiD{xJ96#FwIkP#Tsv~@$h9Naj$Aux+ELSv zns(H*qoy4-?Wk!-O*?AZQPYmPcGR__t{rvlsB1@EJL=j|*N(b&)U~6b9S!YhXh%ak z8rsp&j)rzLw40DLOTlWD72%{j;3}rwWFyWP3>rEM^ihR z+R@aGrgk*7BP3c95^V{I)`UcRLZU?>(Wa1SRYFQ@3F6vR@=ttK+#^ItMC60znn!z|+ zRHVewkx5$_hl`SwI9f947~^nJlM+WyCNEjKf7$N*rC8(#<$rl%>Sc zmMKGw!$n<69DSMcIn$X-tuI*5M7r^zcIOUfeZk@fW+&rt))%alVE$qp&iaC7Rpi|D zjKf)9um*!U$T*z!1q(JVT<0?mXMMry4(0{M;jAzCRRHE^#^J0l_`M-Ab%1d=>kBS5 z!5m;ZbD8x87p5Z9<}eOteZgfcm~D*1SzmC`3+6cEaMl-GBI8%-D#qcgFSwuvvzKu= z>kBTwMJ|}mIGptb7wcd~7>BdI;L;w&H923BbXD6!&zUjy%d?T zhH*IS3pS%*_A?G=eZkgMUBs%{ZL(1)FG*%T_WDXMMqz z8_XWY;jAy%po`3$#yFhy1>1Qr!%SzcZhgV#AIuTP;jAwh6^P8jo1IlSob?5R1u(l9 zhqJz53?VYR6^FCFU}ynuka0Nc3q~AZ4lxdAeZfFPhAm)z zV;s)FK!T*LZ;K@OM?7>BdIVC*9@r-yMk>kEcNV4h_h&iaCp5}5B8hqJz5 z03~u|KjU!L7mTaG>|-3x`hww>$W=2KhqJz56b5E1<8am&49>tDV;s) zuCTsfCkGz%U_NIY&iaC3qR2e_F)w#G>kCGY zV0JPNXMMq-63kzW!&zT2))cvVJ>ziJ7Ysqc9Aq5M`htkG!nV74(1XMMrY8O(9U z;jAwhQHxx+ig7sW3kKR?_A(9^eOan=H;lhUuAk1F#!W5H>!L8QB;EqUv>en3|9vQVMlk{f(8;nOrampmkSKkx`*CNrx7mWE?V7IMkZ@E?OtDXq`t^I27p6 zqEW^pD;&Zd7TlHSWjwONA>5DwwVmPf~UD;&bDDo|fD4yl9Sl6|d7@Y0ncOILbig+r}b@X|dX z_jqK5L#=6WGEF3z=8+W+wdTReFvww#tZ=9`5l)VPJmQfR4z*^&{AxnskrfWLrov$t z$Xy;;;ZSQX%rh+&kF0R0H5pC^K@NH(eHnj@e*)v5!2k3UIQ8eggXTwHz3IWtc=E#5 z9r>+dK3_#1sU^e?~tmaMN?Y?<(Bd{6mkZ+HK4kx{|>_~X!1cgKGi z|NAWc1X{*T9F+;X@dNaT{%ad<>qZ literal 0 HcmV?d00001 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);