Skip to content

Conversation

@bwinsley
Copy link

@bwinsley bwinsley commented Nov 14, 2025

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: #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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant