From: Lukáš Lalinský Date: Wed, 29 Apr 2009 15:12:19 +0000 (+0000) Subject: Fix off-by-one error in MP4::Tag when looking for free padding to use X-Git-Tag: v1.6rc1~32 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=94a402395bb2f4f9d5d38b551c9668160bf361ce;p=taglib Fix off-by-one error in MP4::Tag when looking for free padding to use git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@961160 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- diff --git a/taglib/mp4/mp4tag.cpp b/taglib/mp4/mp4tag.cpp index 47a5b79d..645d4976 100644 --- a/taglib/mp4/mp4tag.cpp +++ b/taglib/mp4/mp4tag.cpp @@ -420,6 +420,8 @@ MP4::Tag::saveExisting(ByteVector &data, AtomList &path) MP4::Atom *meta = path[path.size() - 2]; AtomList::Iterator index = meta->children.find(ilst); + + // check if there is an atom before 'ilst', and possibly use it as padding if(index != meta->children.begin()) { AtomList::Iterator prevIndex = index; prevIndex--; @@ -429,9 +431,10 @@ MP4::Tag::saveExisting(ByteVector &data, AtomList &path) length += prev->length; } } - if(index != meta->children.end()) { - AtomList::Iterator nextIndex = index; - nextIndex++; + // check if there is an atom after 'ilst', and possibly use it as padding + AtomList::Iterator nextIndex = index; + nextIndex++; + if(nextIndex != meta->children.end()) { MP4::Atom *next = *nextIndex; if(next->name == "free") { length += next->length; diff --git a/tests/data/ilst-is-last.m4a b/tests/data/ilst-is-last.m4a new file mode 100644 index 00000000..c56c8049 Binary files /dev/null and b/tests/data/ilst-is-last.m4a differ diff --git a/tests/test_mp4.cpp b/tests/test_mp4.cpp index 2bca203b..04ad729a 100644 --- a/tests/test_mp4.cpp +++ b/tests/test_mp4.cpp @@ -17,6 +17,7 @@ class TestMP4 : public CppUnit::TestFixture CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testFreeForm); CPPUNIT_TEST(testUpdateStco); + CPPUNIT_TEST(testSaveExisingWhenIlstIsLast); CPPUNIT_TEST_SUITE_END(); public: @@ -98,6 +99,25 @@ public: deleteFile(filename); } + void testSaveExisingWhenIlstIsLast() + { + string filename = copyFile("ilst-is-last", ".m4a"); + + MP4::File *f = new MP4::File(filename.c_str()); + CPPUNIT_ASSERT_EQUAL(String("82,164"), f->tag()->itemListMap()["----:com.apple.iTunes:replaygain_track_minmax"].toStringList()[0]); + CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f->tag()->artist()); + f->tag()->setComment("foo"); + f->save(); + delete f; + + f = new MP4::File(filename.c_str()); + CPPUNIT_ASSERT_EQUAL(String("82,164"), f->tag()->itemListMap()["----:com.apple.iTunes:replaygain_track_minmax"].toStringList()[0]); + CPPUNIT_ASSERT_EQUAL(String("Pearl Jam"), f->tag()->artist()); + CPPUNIT_ASSERT_EQUAL(String("foo"), f->tag()->comment()); + + deleteFile(filename); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4);