From 3715b9647779b9956f649e6475af47e7bf2704fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Tue, 5 Apr 2011 15:36:23 +0200 Subject: [PATCH] Protect against incorrect ID3v2 version parameter --- taglib/mpeg/id3v2/id3v2tag.cpp | 5 +++++ tests/test_mpeg.cpp | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/taglib/mpeg/id3v2/id3v2tag.cpp b/taglib/mpeg/id3v2/id3v2tag.cpp index 8a27a20e..5b4c5c5b 100644 --- a/taglib/mpeg/id3v2/id3v2tag.cpp +++ b/taglib/mpeg/id3v2/id3v2tag.cpp @@ -438,6 +438,11 @@ ByteVector ID3v2::Tag::render(int version) const ByteVector tagData; + if(version != 3 && version != 4) { + debug("Unknown ID3v2 version, using ID3v2.4"); + version = 4; + } + // TODO: Render the extended header. // Loop through the frames rendering them and adding them to the tagData. diff --git a/tests/test_mpeg.cpp b/tests/test_mpeg.cpp index 745bcf6b..754caa98 100644 --- a/tests/test_mpeg.cpp +++ b/tests/test_mpeg.cpp @@ -13,6 +13,7 @@ class TestMPEG : public CppUnit::TestFixture CPPUNIT_TEST_SUITE(TestMPEG); CPPUNIT_TEST(testVersion2DurationWithXingHeader); CPPUNIT_TEST(testSaveID3v24); + CPPUNIT_TEST(testSaveID3v24WrongParam); CPPUNIT_TEST(testSaveID3v23); CPPUNIT_TEST_SUITE_END(); @@ -36,6 +37,24 @@ public: f.save(MPEG::File::AllTags, true, 4); MPEG::File f2(newname.c_str()); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f2.ID3v2Tag()->header()->majorVersion()); + CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); + CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); + } + + void testSaveID3v24WrongParam() + { + ScopedFileCopy copy("xing", ".mp3"); + string newname = copy.fileName(); + + String xxx = ByteVector(254, 'X'); + MPEG::File f(newname.c_str()); + f.tag()->setTitle(xxx); + f.tag()->setArtist("Artist A"); + f.save(MPEG::File::AllTags, true, 8); + + MPEG::File f2(newname.c_str()); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(4), f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); } @@ -52,6 +71,7 @@ public: f.save(MPEG::File::AllTags, true, 3); MPEG::File f2(newname.c_str()); + CPPUNIT_ASSERT_EQUAL(TagLib::uint(3), f2.ID3v2Tag()->header()->majorVersion()); CPPUNIT_ASSERT_EQUAL(String("Artist A"), f2.tag()->artist()); CPPUNIT_ASSERT_EQUAL(xxx, f2.tag()->title()); }