From 4e7baeb2c95f2a24938b5a08f4a7762b3ce6b577 Mon Sep 17 00:00:00 2001 From: Morilli <35152647+Morilli@users.noreply.github.com> Date: Sat, 19 Jul 2025 19:36:33 +0200 Subject: [PATCH] fix zipentry comment being lost after reading local entry header --- src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs | 2 -- .../Common/Zip/Headers/DirectoryEntryHeader.cs | 2 -- src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs | 2 ++ src/SharpCompress/Common/Zip/SeekableZipFilePart.cs | 10 ++-------- .../Common/Zip/SeekableZipHeaderFactory.cs | 5 +++++ src/SharpCompress/Common/Zip/ZipEntry.cs | 2 ++ 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs b/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs index f13faee7..4c980f91 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchiveEntry.cs @@ -18,6 +18,4 @@ public class ZipArchiveEntry : ZipEntry, IArchiveEntry public bool IsComplete => true; #endregion - - public string? Comment => ((SeekableZipFilePart)Parts.Single()).Comment; } diff --git a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs index 2b26d298..6ca248e4 100644 --- a/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs +++ b/src/SharpCompress/Common/Zip/Headers/DirectoryEntryHeader.cs @@ -128,6 +128,4 @@ internal class DirectoryEntryHeader : ZipFileEntry public ushort InternalFileAttributes { get; set; } public ushort DiskNumberStart { get; set; } - - public string? Comment { get; private set; } } diff --git a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs index 0570bf6d..6842cba6 100644 --- a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs +++ b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs @@ -120,4 +120,6 @@ internal abstract class ZipFileEntry : ZipHeader internal ZipFilePart? Part { get; set; } internal bool IsZip64 => CompressedSize >= uint.MaxValue; + + internal string? Comment { get; set; } } diff --git a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs index 54c4f527..e7572711 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipFilePart.cs @@ -25,14 +25,8 @@ internal class SeekableZipFilePart : ZipFilePart return base.GetCompressedStream(); } - internal string? Comment => ((DirectoryEntryHeader)Header).Comment; - - private void LoadLocalHeader() - { - var hasData = Header.HasData; - Header = _headerFactory.GetLocalHeader(BaseStream, ((DirectoryEntryHeader)Header)); - Header.HasData = hasData; - } + private void LoadLocalHeader() => + Header = _headerFactory.GetLocalHeader(BaseStream, (DirectoryEntryHeader)Header); protected override Stream CreateBaseStream() { diff --git a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs index 816b0b67..e610c080 100644 --- a/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs +++ b/src/SharpCompress/Common/Zip/SeekableZipHeaderFactory.cs @@ -149,6 +149,11 @@ internal sealed class SeekableZipHeaderFactory : ZipHeaderFactory { throw new InvalidOperationException(); } + + // populate fields only known from the DirectoryEntryHeader + localEntryHeader.HasData = directoryEntryHeader.HasData; + localEntryHeader.Comment = directoryEntryHeader.Comment; + if (FlagUtility.HasFlag(localEntryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) { localEntryHeader.Crc = directoryEntryHeader.Crc; diff --git a/src/SharpCompress/Common/Zip/ZipEntry.cs b/src/SharpCompress/Common/Zip/ZipEntry.cs index d8e947f8..c0b677d7 100644 --- a/src/SharpCompress/Common/Zip/ZipEntry.cs +++ b/src/SharpCompress/Common/Zip/ZipEntry.cs @@ -83,4 +83,6 @@ public class ZipEntry : Entry public override bool IsSplitAfter => false; internal override IEnumerable Parts => _filePart.Empty(); + + public string? Comment => _filePart?.Header.Comment; }