diff --git a/OfficeUtils/src/OfficeUtils.cpp b/OfficeUtils/src/OfficeUtils.cpp index c3308260df..11748064cb 100644 --- a/OfficeUtils/src/OfficeUtils.cpp +++ b/OfficeUtils/src/OfficeUtils.cpp @@ -216,6 +216,15 @@ HRESULT COfficeUtils::GetFilesSize(const std::wstring& _zipFile, const std::wstr } } +int COfficeUtils::GetAddonFlag() +{ + return zlip_get_addition_flag(); +} +void COfficeUtils::SetAddonFlag(int flag) +{ + zlip_set_addition_flag(flag); +} + class CDeflate_private { public: diff --git a/OfficeUtils/src/OfficeUtils.h b/OfficeUtils/src/OfficeUtils.h index f1ef942d4c..e91a01ff30 100644 --- a/OfficeUtils/src/OfficeUtils.h +++ b/OfficeUtils/src/OfficeUtils.h @@ -35,6 +35,10 @@ #include "OfficeUtilsCommon.h" #include "../../Common/kernel_config.h" +#define ZLIB_ADDON_FLAG_ZERO 0 +#define ZLIB_ADDON_FLAG_READ_ONLY 1 +#define ZLIB_ADDON_FLAG_WINDOWS_SHARED_WRITE 2 + #ifndef Z_DEFLATED #define Z_DEFLATED 8 #endif @@ -59,6 +63,8 @@ public: HRESULT CompressFilesFromMemory (const std::wstring& zipFile, const RequestFileCallback& data_source, void* pParam, short compression_level, bool* result); HRESULT GetFilesSize (const std::wstring& zipFile, const std::wstring& searchPattern, ULONG64& nCommpressed, ULONG64& nUncommpressed); + static int GetAddonFlag(); + static void SetAddonFlag(int flag); }; #define DEFLATE_NO_FLUSH 0 diff --git a/OfficeUtils/src/ZipUtilsCP.cpp b/OfficeUtils/src/ZipUtilsCP.cpp index 86ec6f6361..038637c71a 100644 --- a/OfficeUtils/src/ZipUtilsCP.cpp +++ b/OfficeUtils/src/ZipUtilsCP.cpp @@ -846,9 +846,10 @@ int ZipDir( const WCHAR* dir, const WCHAR* outputFile, const OnProgressCallback* if ( ( zipFile != NULL ) && ( unzipDir != NULL ) ) { - zlip_set_addition_flag(ZLIB_ADDON_FLAG_READ_ONLY); + int old = zlip_get_addition_flag(); + zlip_set_addition_flag(old | ZLIB_ADDON_FLAG_READ_ONLY); uf = unzOpenHelp (zipFile); - zlip_set_addition_flag(ZLIB_ADDON_FLAG_ZERO); + zlip_set_addition_flag(old); } if ( uf != NULL ) diff --git a/OfficeUtils/src/zlib-1.2.11/contrib/minizip/iowin32.c b/OfficeUtils/src/zlib-1.2.11/contrib/minizip/iowin32.c index 274f39eb1d..fc731cbf3a 100644 --- a/OfficeUtils/src/zlib-1.2.11/contrib/minizip/iowin32.c +++ b/OfficeUtils/src/zlib-1.2.11/contrib/minizip/iowin32.c @@ -61,6 +61,9 @@ static void win32_translate_open_mode(int mode, *lpdwDesiredAccess = GENERIC_READ; *lpdwCreationDisposition = OPEN_EXISTING; *lpdwShareMode = FILE_SHARE_READ; + + if (zlip_get_addition_flag() & ZLIB_ADDON_FLAG_WINDOWS_SHARED_WRITE) + *lpdwShareMode |= FILE_SHARE_WRITE; } else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) { diff --git a/OfficeUtils/src/zlib_addon.h b/OfficeUtils/src/zlib_addon.h index b5e73cad9b..c656e609b6 100644 --- a/OfficeUtils/src/zlib_addon.h +++ b/OfficeUtils/src/zlib_addon.h @@ -31,8 +31,11 @@ */ #pragma once -#define ZLIB_ADDON_FLAG_ZERO 0 -#define ZLIB_ADDON_FLAG_READ_ONLY 1 +#ifndef ZLIB_ADDON_FLAG_ZERO +#define ZLIB_ADDON_FLAG_ZERO 0 +#define ZLIB_ADDON_FLAG_READ_ONLY 1 +#define ZLIB_ADDON_FLAG_WINDOWS_SHARED_WRITE 2 +#endif void zlip_set_addition_flag(int flag); int zlip_get_addition_flag();