From 7c56df1237e98a6478516d338b16b1f06daf303d Mon Sep 17 00:00:00 2001 From: Lars Vahlenberg Date: Thu, 28 Jul 2022 20:36:28 +0200 Subject: [PATCH] Mitigation of problems --- .../Common/Zip/StreamingZipFilePart.cs | 16 ++++++++++++---- src/SharpCompress/Readers/AbstractReader.cs | 2 +- .../SharpCompress.Test/Zip/ZipArchiveTests.cs | 13 +++++++++++-- tests/SharpCompress.Test/Zip/ZipReaderTests.cs | 18 +++++++++++++++++- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs b/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs index fbffe179..f287ab73 100644 --- a/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs @@ -43,12 +43,20 @@ namespace SharpCompress.Common.Zip { _decompressionStream ??= GetCompressedStream(); - _decompressionStream.Skip(); - - if (_decompressionStream is DeflateStream deflateStream) + if( Header.CompressionMethod != ZipCompressionMethod.None ) { - rewindableStream.Rewind(deflateStream.InputBuffer); + _decompressionStream.Skip(); + + if (_decompressionStream is DeflateStream deflateStream) + { + rewindableStream.Rewind(deflateStream.InputBuffer); + } } + else + { + // We would need to search for the magic word + } + Skipped = true; } var reader = new BinaryReader(rewindableStream); diff --git a/src/SharpCompress/Readers/AbstractReader.cs b/src/SharpCompress/Readers/AbstractReader.cs index 80e6cf07..619d834e 100644 --- a/src/SharpCompress/Readers/AbstractReader.cs +++ b/src/SharpCompress/Readers/AbstractReader.cs @@ -132,7 +132,6 @@ namespace SharpCompress.Readers private void Skip() { var part = Entry.Parts.First(); - part.Skipped = true; if (ArchiveType != ArchiveType.Rar && !Entry.IsSolid @@ -145,6 +144,7 @@ namespace SharpCompress.Readers { var bytesToAdvance = Entry.CompressedSize; rawStream.Skip(bytesToAdvance); + part.Skipped = true; return; } } diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index dfe68c30..67653e77 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -738,13 +738,22 @@ namespace SharpCompress.Test.Zip [Fact] public void Zip_Uncompressed_Skip_All() { - string zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.uncompressed.zip"); + var keys = new string[] { "Folder/File1.txt", "Folder/File2.rtf", "Folder2/File1.txt", "Folder2/File2.txt", "DEADBEEF" }; + var zipPath = Path.Combine(TEST_ARCHIVES_PATH, "Zip.uncompressed.zip"); using (var stream = File.Open(zipPath, FileMode.Open, FileAccess.Read)) { IArchive archive = ArchiveFactory.Open(stream); IReader reader = archive.ExtractAllEntries(); + int x = 0; while (reader.MoveToNextEntry()) - ; + { + Assert.Equal(keys[x], reader.Entry.Key); + x++; + } + + // if we implement searching for DataDescriptor on none compressed streams + // this would work, see StreamingZipFilePart function FixStreamedFileLocation + // Assert.Equal(4, x); } } } diff --git a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs index d2b23877..cc4b215d 100644 --- a/tests/SharpCompress.Test/Zip/ZipReaderTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipReaderTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using SharpCompress.Common; using SharpCompress.IO; @@ -368,5 +368,21 @@ namespace SharpCompress.Test.Zip } } + [Fact] + public void Zip_ReaderMoveToNextEntry() + { + var keys = new string[] { "version", "sizehint", "data/0/metadata", "data/0/records" }; + + using (var fileStream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "test_477.zip"))) + using (var reader = ZipReader.Open(fileStream)) + { + foreach( var key in keys) + { + reader.MoveToNextEntry(); + + Assert.Equal(reader.Entry.Key, key); + } + } + } } }