From 73e2e0709b2762da2e6280204368a404eae8bb3f Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Date: Thu, 28 Jul 2022 15:48:39 -0300 Subject: [PATCH] Fix wrapper code for zlib to recognize directories encoded as files of size=0 with names ending in "/" Fixes #4189 --- contrib/qzip/zip.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contrib/qzip/zip.cpp b/contrib/qzip/zip.cpp index 974530037..ba994f948 100644 --- a/contrib/qzip/zip.cpp +++ b/contrib/qzip/zip.cpp @@ -430,6 +430,10 @@ void QZipPrivate::fillFileInfo(int index, ZipReader::FileInfo &fileInfo) const fileInfo.crc_32 = readUInt(header.h.crc_32); fileInfo.size = readUInt(header.h.uncompressed_size); fileInfo.lastModified = readMSDosDate(header.h.last_mod_file); + // Files of size 0 ending in "/" seems to be an alternative directory encoding used by some compressors + bool altIsDir = (fileInfo.size == 0 && fileInfo.filePath.endsWith("/")); + fileInfo.isDir = fileInfo.isDir || altIsDir; + fileInfo.isFile = fileInfo.isFile && !altIsDir; } class ZipReaderPrivate : public QZipPrivate @@ -930,7 +934,7 @@ bool ZipReader::extractAll(const QString &destinationDir) const if (fi.isDir) { if (!baseDir.mkpath(fi.filePath)) return false; - if (!QFile::setPermissions(absPath, fi.permissions)) + if (fi.permissions > 0 && !QFile::setPermissions(absPath, fi.permissions)) return false; } }