SharpZipLib icon indicating copy to clipboard operation
SharpZipLib copied to clipboard

Fix compression method for encrypted empty files and directories when updating a ZipFile

Open bwinsley opened this issue 1 month ago • 0 comments

I certify that I own, and have sufficient rights to contribute, all source code and related material intended to be compiled or integrated with the source code for the SharpZipLib open source product (the "Contribution"). My Contribution is licensed under the MIT License.

Fixes this issue: https://github.com/icsharpcode/SharpZipLib/issues/885

This PR fixes an issue that is encountered when calling ZipInputStream.GetNextEntry() on an encrypted zip that contains a directory which was added using ZipFile.AddDirectory().

ZipFile.AddDirectory() adds an empty file with compression method set to Deflated but when running updates, will set this method to Stored as it is an empty file. ZipInputStream will observe that it is stored, crypted, and that the compressed size (0) less a crypto header size is not equal to the file size. This is because ZipFile will not write an encryption header for files that are zero length.

When creating a directory with ZipOutputStream, the directory is NOT set to Stored despite being empty

if (method == CompressionMethod.Stored && (!isCrypted && csize != size || (isCrypted && csize - ZipConstants.CryptoHeaderSize != size)))
{
	throw new ZipException("Stored, but compressed != uncompressed");
}

This PR makes a change so as to not set the compression method to stored for files that are zero length if they are encrypted. It also adds a unit test to ensure that it works, this unit test failed before the fix was implemented. This PR also has formatting/linting changes which were automatically done by my code editor

I certify that I own, and have sufficient rights to contribute, all source code and related material intended to be compiled or integrated with the source code for the SharpZipLib open source product (the "Contribution"). My Contribution is licensed under the MIT License.

bwinsley avatar Nov 14 '25 05:11 bwinsley