From 13be28a52c72e0b647cd1fd4d43688d4b85c21cb Mon Sep 17 00:00:00 2001 From: Tsuda Kageyu Date: Sun, 8 Jan 2017 02:11:57 +0900 Subject: [PATCH] Be tolerant of empty FLAC seektable blocks. --- taglib/flac/flacfile.cpp | 4 +++- tests/data/empty-seektable.flac | Bin 0 -> 4608 bytes tests/test_flac.cpp | 19 +++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 tests/data/empty-seektable.flac diff --git a/taglib/flac/flacfile.cpp b/taglib/flac/flacfile.cpp index b2014886..6b224103 100644 --- a/taglib/flac/flacfile.cpp +++ b/taglib/flac/flacfile.cpp @@ -506,7 +506,9 @@ void FLAC::File::scan() return; } - if(blockLength == 0 && blockType != MetadataBlock::Padding) { + if(blockLength == 0 + && blockType != MetadataBlock::Padding && blockType != MetadataBlock::SeekTable) + { debug("FLAC::File::scan() -- Zero-sized metadata block found"); setValid(false); return; diff --git a/tests/data/empty-seektable.flac b/tests/data/empty-seektable.flac new file mode 100644 index 0000000000000000000000000000000000000000..20dd90d91665a122693ab1150771f7e11b2a136a GIT binary patch literal 4608 zcmYfENpxmlU{DfZ5CBpF3^snE9nA%ds%Am`S618!`pG=WiAO1a?vo!EnSt^w3=A3y zK)NV3Ewv~$FF92qCo{>-$I)5AP|r}$Si#7^z}&#n&>X0Qp%H8%h&2jELtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz5lo2>kzXP=?_+%!jv&KzzmnF#ZZR5TEHJ zjBhIi;xnIv@%{8be3siV{`BP_KI5ukl7IUW>Rd}qpmU8NH$P&vXZ=4rS)$B?)zqqGKj5Ef2j`C%_OwDPNw3RL# zp0QBu*{U-;cb9a2)(WyRo*B5_yf;%^_;baz+}%aiS*JTbBu0C5DIU?7c;uJb+C)*M zh#t)uE0Q-wc`q^KQr(?5u}?*#Yu2HvGa7UEomj-By3q literal 0 HcmV?d00001 diff --git a/tests/test_flac.cpp b/tests/test_flac.cpp index f2065e09..5bae7d88 100644 --- a/tests/test_flac.cpp +++ b/tests/test_flac.cpp @@ -63,6 +63,7 @@ class TestFLAC : public CppUnit::TestFixture CPPUNIT_TEST(testEmptyID3v2); CPPUNIT_TEST(testStripTags); CPPUNIT_TEST(testRemoveXiphField); + CPPUNIT_TEST(testEmptySeekTable); CPPUNIT_TEST_SUITE_END(); public: @@ -516,6 +517,24 @@ public: } } + void testEmptySeekTable() + { + ScopedFileCopy copy("empty-seektable", ".flac"); + { + FLAC::File f(copy.fileName().c_str()); + CPPUNIT_ASSERT(f.isValid()); + f.xiphComment(true)->setTitle("XiphComment Title"); + f.save(); + } + { + FLAC::File f(copy.fileName().c_str()); + CPPUNIT_ASSERT(f.isValid()); + f.seek(42); + const ByteVector data = f.readBlock(4); + CPPUNIT_ASSERT_EQUAL(ByteVector("\x03\x00\x00\x00", 4), data); + } + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestFLAC);