Index: karchivetest.h =================================================================== --- karchivetest.h +++ karchivetest.h @@ -92,6 +92,7 @@ void testZipReadRedundantDataDescriptor(); void testZipDirectoryPermissions(); void testZipUnusualButValid(); + void testZipDuplicateNames(); void testRcc(); Index: karchivetest.cpp =================================================================== --- karchivetest.cpp +++ karchivetest.cpp @@ -1159,6 +1159,27 @@ QCOMPARE(listing.join(' '), QLatin1String("mode=40744 path=test type=dir mode=744 path=test/os-release type=file size=199")); } +void KArchiveTest::testZipDuplicateNames() +{ + QString fileName = QFINDTESTDATA("data/out.epub"); + QVERIFY(!fileName.isEmpty()); + + KZip zip(fileName); + + QVERIFY(zip.open(QIODevice::ReadOnly)); + + int metaInfCount = 0; + const QStringList entries = zip.directory()->entries(); + for (const QString &entryName : entries) { + if (entryName.startsWith("META-INF")) { + metaInfCount++; + } + } + + QVERIFY2(metaInfCount == 1, "Archive root directory contains duplicates"); +} + + void KArchiveTest::testRcc() { const QString rccFile = QFINDTESTDATA("runtime_resource.rcc"); // was copied from qtbase/tests/auto/corelib/io/qresourceengine