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");