From ab5af409996fdde6ea986c738df9eeeeffdeb6d8 Mon Sep 17 00:00:00 2001 From: Robb Pryde Date: Sat, 26 Oct 2024 01:22:07 +0100 Subject: [PATCH 1/2] Fixed bug in zip time header flags, and failing to parse it no longer throws an exception. --- .../Headers/LocalEntryHeaderExtraFactory.cs | 21 +++++++++++++------ src/SharpCompress/Common/Zip/ZipEntry.cs | 21 ++++++++++++++++--- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeaderExtraFactory.cs b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeaderExtraFactory.cs index 88e4a187..f90272c4 100644 --- a/src/SharpCompress/Common/Zip/Headers/LocalEntryHeaderExtraFactory.cs +++ b/src/SharpCompress/Common/Zip/Headers/LocalEntryHeaderExtraFactory.cs @@ -166,10 +166,10 @@ public UnixTimeExtraField(ExtraDataType type, ushort length, byte[] dataBytes) return Tuple.Create(null, null, null); } - var flags = DataBytes[0]; - var isModifiedTimeSpecified = (flags & 0x01) == 1; - var isLastAccessTimeSpecified = (flags & 0x02) == 1; - var isCreationTimeSpecified = (flags & 0x04) == 1; + var flags = (RecordedTimeFlag)DataBytes[0]; + var isModifiedTimeSpecified = flags.HasFlag(RecordedTimeFlag.LastModified); + var isLastAccessTimeSpecified = flags.HasFlag(RecordedTimeFlag.LastAccessed); + var isCreationTimeSpecified = flags.HasFlag(RecordedTimeFlag.Created); var currentIndex = 1; DateTime? modifiedTime = null; DateTime? lastAccessTime = null; @@ -189,7 +189,7 @@ public UnixTimeExtraField(ExtraDataType type, ushort length, byte[] dataBytes) { if (currentIndex + 4 > DataBytes.Length) { - throw new ArchiveException("Invalid UnicodeExtraTime field"); + return Tuple.Create(null, null, null); } var lastAccessEpochTime = BinaryPrimitives.ReadInt32LittleEndian( @@ -206,7 +206,7 @@ public UnixTimeExtraField(ExtraDataType type, ushort length, byte[] dataBytes) { if (currentIndex + 4 > DataBytes.Length) { - throw new ArchiveException("Invalid UnicodeExtraTime field"); + return Tuple.Create(null, null, null); } var creationTimeEpochTime = BinaryPrimitives.ReadInt32LittleEndian( @@ -222,6 +222,15 @@ public UnixTimeExtraField(ExtraDataType type, ushort length, byte[] dataBytes) return Tuple.Create(modifiedTime, lastAccessTime, creationTime); } } + + [Flags] + private enum RecordedTimeFlag + { + None = 0, + LastModified = 1, + LastAccessed = 2, + Created = 4 + } } internal static class LocalEntryHeaderExtraFactory diff --git a/src/SharpCompress/Common/Zip/ZipEntry.cs b/src/SharpCompress/Common/Zip/ZipEntry.cs index 2700e005..05d1d885 100644 --- a/src/SharpCompress/Common/Zip/ZipEntry.cs +++ b/src/SharpCompress/Common/Zip/ZipEntry.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using SharpCompress.Common.Zip.Headers; namespace SharpCompress.Common.Zip; @@ -15,10 +16,16 @@ internal ZipEntry(ZipFilePart? filePart) return; } _filePart = filePart; + LastModifiedTime = Utility.DosDateToDateTime( filePart.Header.LastModifiedDate, filePart.Header.LastModifiedTime ); + + var times = filePart.Header.Extra.FirstOrDefault(header => header.GetType() == typeof(UnixTimeExtraField)) as UnixTimeExtraField; + + LastAccessedTime = times?.UnicodeTimes.Item2; + CreatedTime = times?.UnicodeTimes.Item3; } public override CompressionType CompressionType => @@ -51,9 +58,17 @@ internal ZipEntry(ZipFilePart? filePart) public override DateTime? LastModifiedTime { get; } - public override DateTime? CreatedTime => null; - - public override DateTime? LastAccessedTime => null; + /// + /// + /// The returned time is UTC, not local. + /// + public override DateTime? CreatedTime { get; } + + /// + /// + /// The returned time is UTC, not local. + /// + public override DateTime? LastAccessedTime { get; } public override DateTime? ArchivedTime => null; From 0faa176791939ba9b44c594db9b26b35222322a3 Mon Sep 17 00:00:00 2001 From: Robb Pryde Date: Thu, 31 Oct 2024 17:35:47 +0000 Subject: [PATCH 2/2] Sharpier styling --- src/SharpCompress/Common/Zip/ZipEntry.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/SharpCompress/Common/Zip/ZipEntry.cs b/src/SharpCompress/Common/Zip/ZipEntry.cs index 05d1d885..802dd19a 100644 --- a/src/SharpCompress/Common/Zip/ZipEntry.cs +++ b/src/SharpCompress/Common/Zip/ZipEntry.cs @@ -22,7 +22,10 @@ internal ZipEntry(ZipFilePart? filePart) filePart.Header.LastModifiedTime ); - var times = filePart.Header.Extra.FirstOrDefault(header => header.GetType() == typeof(UnixTimeExtraField)) as UnixTimeExtraField; + var times = + filePart.Header.Extra.FirstOrDefault(header => + header.GetType() == typeof(UnixTimeExtraField) + ) as UnixTimeExtraField; LastAccessedTime = times?.UnicodeTimes.Item2; CreatedTime = times?.UnicodeTimes.Item3;