diff --git a/src/SharpCompress/Common/Zip/ZipFilePart.cs b/src/SharpCompress/Common/Zip/ZipFilePart.cs index f8fd6cd5e..77dc4abba 100644 --- a/src/SharpCompress/Common/Zip/ZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/ZipFilePart.cs @@ -70,17 +70,12 @@ protected Stream CreateDecompressionStream(Stream stream, ZipCompressionMethod m { case ZipCompressionMethod.None: { - if (stream is ReadOnlySubStream) + if (Header.CompressedSize is 0) { - return stream; + return new DataDescriptorStream(stream); } - if (Header.CompressedSize > 0) - { - return new ReadOnlySubStream(stream, Header.CompressedSize); - } - - return new DataDescriptorStream(stream); + return stream; } case ZipCompressionMethod.Shrink: { diff --git a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs index f8d69d6dc..835521e0f 100644 --- a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs @@ -379,4 +379,21 @@ public void Zip_Uncompressed_64bit() Assert.Equal(4, x); } + + [Fact] + public void Zip_Uncompressed_Encrypted_Read() + { + using var archive = ArchiveFactory.Open( + Path.Combine(TEST_ARCHIVES_PATH, "Zip.none.encrypted.zip"), + new ReaderOptions { Password = "test" } + ); + using var reader = archive.ExtractAllEntries(); + reader.MoveToNextEntry(); + Assert.Equal("first.txt", reader.Entry.Key); + Assert.Equal(199, reader.Entry.Size); + reader.OpenEntryStream().Dispose(); + reader.MoveToNextEntry(); + Assert.Equal("second.txt", reader.Entry.Key); + Assert.Equal(197, reader.Entry.Size); + } } diff --git a/tests/TestArchives/Archives/Zip.none.encrypted.zip b/tests/TestArchives/Archives/Zip.none.encrypted.zip new file mode 100644 index 000000000..915a2be85 Binary files /dev/null and b/tests/TestArchives/Archives/Zip.none.encrypted.zip differ