From f3fb4d83a469fea7e23491a1dfbac14c728ac968 Mon Sep 17 00:00:00 2001 From: Stephen Booth Date: Fri, 17 May 2024 23:45:10 -0500 Subject: [PATCH] Skip unknown MP4 boxes (#1231) --- taglib/mp4/mp4atom.cpp | 7 ------- tests/data/nonprintable-atom-type.m4a | Bin 0 -> 12855 bytes tests/test_mp4.cpp | 20 ++++++++++++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 tests/data/nonprintable-atom-type.m4a diff --git a/taglib/mp4/mp4atom.cpp b/taglib/mp4/mp4atom.cpp index 0a1eb587..4c558526 100644 --- a/taglib/mp4/mp4atom.cpp +++ b/taglib/mp4/mp4atom.cpp @@ -95,13 +95,6 @@ MP4::Atom::Atom(File *file) } d->name = header.mid(4, 4); - for(int i = 0; i < 4; ++i) { - if(const char ch = d->name.at(i); (ch < ' ' || ch > '~') && ch != '\251') { - debug("MP4: Invalid atom type"); - d->length = 0; - file->seek(0, File::End); - } - } for(auto c : containers) { if(d->name == c) { diff --git a/tests/data/nonprintable-atom-type.m4a b/tests/data/nonprintable-atom-type.m4a new file mode 100644 index 0000000000000000000000000000000000000000..bf7858a05df6810cac3c44efb2b502f425f20dd3 GIT binary patch literal 12855 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 DM&Gjo literal 0 HcmV?d00001 diff --git a/tests/test_mp4.cpp b/tests/test_mp4.cpp index c37e4e04..ea4a8d0a 100644 --- a/tests/test_mp4.cpp +++ b/tests/test_mp4.cpp @@ -101,6 +101,7 @@ class TestMP4 : public CppUnit::TestFixture CPPUNIT_TEST(testRemoveMetadata); CPPUNIT_TEST(testNonFullMetaAtom); CPPUNIT_TEST(testItemFactory); + CPPUNIT_TEST(testNonPrintableAtom); CPPUNIT_TEST_SUITE_END(); public: @@ -847,6 +848,25 @@ public: CPPUNIT_ASSERT_EQUAL(StringList("456"), properties.value("TESTINTEGER")); } } + + void testNonPrintableAtom() + { + ScopedFileCopy copy("nonprintable-atom-type", ".m4a"); + { + MP4::File f(copy.fileName().c_str()); + CPPUNIT_ASSERT(f.isValid()); + CPPUNIT_ASSERT_EQUAL(1, f.audioProperties()->channels()); + CPPUNIT_ASSERT_EQUAL(32000, f.audioProperties()->sampleRate()); + f.tag()->setTitle("TITLE"); + f.save(); + } + { + MP4::File f(copy.fileName().c_str()); + CPPUNIT_ASSERT(f.isValid()); + CPPUNIT_ASSERT(f.hasMP4Tag()); + CPPUNIT_ASSERT_EQUAL(String("TITLE"), f.tag()->title()); + } + } }; CPPUNIT_TEST_SUITE_REGISTRATION(TestMP4);