Skip to content

Commit 8d63ab6

Browse files
authored
Merge pull request #891 from Morilli/fix-zip-datadescriptor-header
Fix zip entry handling for entries with data descriptors
2 parents 79ed965 + 37a2fa1 commit 8d63ab6

3 files changed

Lines changed: 19 additions & 17 deletions

File tree

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,19 @@
11
using System.IO;
22
using SharpCompress.Common.Zip.Headers;
3-
using SharpCompress.IO;
43

54
namespace SharpCompress.Common.Zip;
65

76
internal class SeekableZipFilePart : ZipFilePart
87
{
98
private bool _isLocalHeaderLoaded;
109
private readonly SeekableZipHeaderFactory _headerFactory;
11-
private readonly DirectoryEntryHeader _directoryEntryHeader;
1210

1311
internal SeekableZipFilePart(
1412
SeekableZipHeaderFactory headerFactory,
1513
DirectoryEntryHeader header,
1614
Stream stream
1715
)
18-
: base(header, stream)
19-
{
20-
_headerFactory = headerFactory;
21-
_directoryEntryHeader = header;
22-
}
16+
: base(header, stream) => _headerFactory = headerFactory;
2317

2418
internal override Stream GetCompressedStream()
2519
{
@@ -44,16 +38,6 @@ protected override Stream CreateBaseStream()
4438
{
4539
BaseStream.Position = Header.DataStartPosition.NotNull();
4640

47-
if (
48-
(Header.CompressedSize == 0)
49-
&& FlagUtility.HasFlag(Header.Flags, HeaderFlags.UsePostDataDescriptor)
50-
&& _directoryEntryHeader.HasData
51-
&& (_directoryEntryHeader.CompressedSize != 0)
52-
)
53-
{
54-
return new ReadOnlySubStream(BaseStream, _directoryEntryHeader.CompressedSize);
55-
}
56-
5741
return BaseStream;
5842
}
5943
}

src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ DirectoryEntryHeader directoryEntryHeader
149149
{
150150
throw new InvalidOperationException();
151151
}
152+
if (FlagUtility.HasFlag(localEntryHeader.Flags, HeaderFlags.UsePostDataDescriptor))
153+
{
154+
localEntryHeader.Crc = directoryEntryHeader.Crc;
155+
localEntryHeader.CompressedSize = directoryEntryHeader.CompressedSize;
156+
localEntryHeader.UncompressedSize = directoryEntryHeader.UncompressedSize;
157+
}
152158
return localEntryHeader;
153159
}
154160
}

tests/SharpCompress.Test/Zip/ZipArchiveTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,4 +808,16 @@ public void Zip_Forced_Ignores_UnicodePathExtra()
808808
Assert.Equal("きょきゅんきゃんきゅ_wav.frq", reader.Entry.Key);
809809
}
810810
}
811+
812+
[Fact]
813+
public void TestDataDescriptorRead()
814+
{
815+
using var archive = ArchiveFactory.Open(
816+
Path.Combine(TEST_ARCHIVES_PATH, "Zip.none.datadescriptors.zip")
817+
);
818+
var firstEntry = archive.Entries.First();
819+
Assert.Equal(199, firstEntry.Size);
820+
using var _ = firstEntry.OpenEntryStream();
821+
Assert.Equal(199, firstEntry.Size);
822+
}
811823
}

0 commit comments

Comments
 (0)