From 9e9077d1e0c7b9ae02d5ba9ed70cf10cc216560f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Lalinsk=C3=BD?= Date: Mon, 14 Dec 2009 18:42:40 +0000 Subject: [PATCH] Be more paranoid about checking MP4 files To consider something a valid MP4 file, it must have a 'moov' atom. Otherwise it's marked as invalid and we won't try to read/write tags. CCBUG:216819 git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/kdesupport/taglib@1062426 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- taglib/mp4/mp4file.cpp | 7 +++++++ tests/test_mp4.cpp | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/taglib/mp4/mp4file.cpp b/taglib/mp4/mp4file.cpp index 3c996d1b..21a5429b 100644 --- a/taglib/mp4/mp4file.cpp +++ b/taglib/mp4/mp4file.cpp @@ -113,6 +113,13 @@ MP4::File::read(bool readProperties, Properties::ReadStyle audioPropertiesStyle) return; } + // must have a moov atom, otherwise consider it invalid + MP4::Atom *moov = d->atoms->find("moov"); + if(!moov) { + setValid(false); + return; + } + d->tag = new Tag(this, d->atoms); if(readProperties) { d->properties = new Properties(this, d->atoms, audioPropertiesStyle); diff --git a/tests/test_mp4.cpp b/tests/test_mp4.cpp index a5b301bc..ce6f1897 100644 --- a/tests/test_mp4.cpp +++ b/tests/test_mp4.cpp @@ -16,6 +16,7 @@ class TestMP4 : public CppUnit::TestFixture CPPUNIT_TEST_SUITE(TestMP4); CPPUNIT_TEST(testProperties); CPPUNIT_TEST(testFreeForm); + CPPUNIT_TEST(testCheckValid); CPPUNIT_TEST(testUpdateStco); CPPUNIT_TEST(testSaveExisingWhenIlstIsLast); CPPUNIT_TEST(test64BitAtom); @@ -36,6 +37,14 @@ public: CPPUNIT_ASSERT_EQUAL(16, ((MP4::Properties *)f.audioProperties())->bitsPerSample()); } + void testCheckValid() + { + MP4::File f("data/empty.aiff"); + CPPUNIT_ASSERT(!f.isValid()); + MP4::File f2("data/has-tags.m4a"); + CPPUNIT_ASSERT(f2.isValid()); + } + void testUpdateStco() { ScopedFileCopy copy("no-tags", ".3g2");