diff --git a/src/karchive.cpp b/src/karchive.cpp --- a/src/karchive.cpp +++ b/src/karchive.cpp @@ -468,7 +468,19 @@ const KArchiveDirectory *dir = static_cast(ent); return const_cast(dir); } else { - //qCWarning(KArchiveLog) << "Found" << path << "but it's not a directory"; + qCWarning(KArchiveLog) << "Found" << path << "but it's not a directory"; + if (ent->isFile()) { + const KArchiveFile *file = static_cast(ent); + if (file->size() > 0) { + qCWarning(KArchiveLog) << "It's a normal file, bailing out"; + return nullptr; + } + } + + qCWarning(KArchiveLog) << "It's an empty file, assuming it is actually a directory and replacing"; + KArchiveEntry *myEntry = const_cast(ent); + rootDir()->removeEntry(myEntry); + delete myEntry; } } @@ -827,8 +839,8 @@ void KArchiveDirectory::addEntry(KArchiveEntry *entry) { if (d->entries.value(entry->name())) { - /*qCWarning(KArchiveLog) << "directory " << name() - << "has entry" << entry->name() << "already";*/ + qCWarning(KArchiveLog) << "directory " << name() + << "has entry" << entry->name() << "already"; delete entry; return; } diff --git a/src/kzip.cpp b/src/kzip.cpp --- a/src/kzip.cpp +++ b/src/kzip.cpp @@ -750,7 +750,13 @@ QString path = QDir::cleanPath(name.left(pos)); // Ensure container directory exists, create otherwise KArchiveDirectory *tdir = findOrCreate(path); - tdir->addEntry(entry); + if (tdir) { + tdir->addEntry(entry); + } else { + setErrorString(tr("File %1 is in folder %2, but %3 is actually a file.").arg(entryName).arg(path).arg(path)); + delete entry; + return false; + } } }