From 0aec0e084e10c200dc87981f12a47e3c71d4b58e Mon Sep 17 00:00:00 2001 From: Alexey Ivanov Date: Mon, 17 Aug 2020 22:03:54 +0000 Subject: [PATCH] libzipplugin.cpp: replace zip_fopen/zip_fclose with unique_ptr --- plugins/libzipplugin/libzipplugin.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/plugins/libzipplugin/libzipplugin.cpp b/plugins/libzipplugin/libzipplugin.cpp index 3749af23..bf333a9a 100644 --- a/plugins/libzipplugin/libzipplugin.cpp +++ b/plugins/libzipplugin/libzipplugin.cpp @@ -479,9 +479,9 @@ bool LibzipPlugin::testArchive() return false; } - zip_file *zipFile = zip_fopen_index(archive, i, 0); + std::unique_ptr zipFile { zip_fopen_index(archive, i, 0), &zip_fclose }; std::unique_ptr buf(new uchar[statBuffer.size]); - const int len = zip_fread(zipFile, buf.get(), statBuffer.size); + const int len = zip_fread(zipFile.get(), buf.get(), statBuffer.size) if (len == -1 || uint(len) != statBuffer.size) { qCCritical(ARK) << "Failed to read data for" << statBuffer.name; return false; @@ -490,9 +490,6 @@ bool LibzipPlugin::testArchive() qCCritical(ARK) << "CRC check failed for" << statBuffer.name; return false; } - - // Free libzip file entry from the memory - zip_fclose(zipFile); emit progress(float(i) / nofEntries); } @@ -676,11 +673,10 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr } // Handle password-protected files. - zip_file *zipFile = nullptr; + std::unique_ptr zipFile { zip_fopen(archive, entry.toUtf8().constData(), 0), &zip_fclose }; bool firstTry = true; - while (!zipFile) { - zipFile = zip_fopen(archive, entry.toUtf8().constData(), 0); - if (zipFile) { + while (!zipFile.get()) { + if (zipFile.get()) { break; } else if (zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_NOPASSWD || zip_error_code_zip(zip_get_error(archive)) == ZIP_ER_WRONGPASSWD) { @@ -718,7 +714,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr qulonglong sum = 0; char buf[1000]; while (sum != statBuffer.size) { - const auto readBytes = zip_fread(zipFile, buf, 1000); + const auto readBytes = zip_fread(zipFile.get(), buf, 1000); if (readBytes < 0) { qCCritical(ARK) << "Failed to read data"; emit error(xi18n("Failed to read data for entry: %1", entry)); @@ -757,9 +753,7 @@ bool LibzipPlugin::extractEntry(zip_t *archive, const QString &entry, const QStr default: // TODO: non-UNIX. break; } - - // Free libzip file entry from the memory - zip_fclose(zipFile); + // Close extracted file, flush any buffered data file.close(); } -- GitLab