From cf4f613a657c0bcf205fef5732bed3e472e25653 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Wed, 23 Jul 2025 14:45:33 -0400 Subject: [PATCH] Minor fixes and tests for MS-ZIP --- SabreTools.IO.Test/Compression/MSZIPTests.cs | 32 ++++++++++++++++++ SabreTools.IO.Test/TestData/test-archive.msz | Bin 0 -> 15639 bytes .../Compression/MSZIP/Decompressor.cs | 6 +++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 SabreTools.IO.Test/Compression/MSZIPTests.cs create mode 100644 SabreTools.IO.Test/TestData/test-archive.msz diff --git a/SabreTools.IO.Test/Compression/MSZIPTests.cs b/SabreTools.IO.Test/Compression/MSZIPTests.cs new file mode 100644 index 0000000..9357744 --- /dev/null +++ b/SabreTools.IO.Test/Compression/MSZIPTests.cs @@ -0,0 +1,32 @@ +using System; +using System.IO; +using System.Text; +using SabreTools.IO.Compression.MSZIP; +using SabreTools.IO.Extensions; +using Xunit; + +namespace SabreTools.IO.Test.Compression +{ + public class MSZIPTests + { + [Fact] + public void DecompressorTest() + { + // Testing Note: This is a fake file that has multiple blocks + // sequentially. In real cabinet files, these are embedded in + // CFDATA blocks. + string path = Path.Combine(Environment.CurrentDirectory, "TestData", "test-archive.msz"); + byte[] inputBytes = File.ReadAllBytes(path); + MemoryStream input = new MemoryStream(inputBytes); + MemoryStream output = new MemoryStream(); + + var decompressor = Decompressor.Create(); + input.SeekIfPossible(0x0000); + decompressor.CopyTo(input, output); + input.SeekIfPossible(0x3969); + decompressor.CopyTo(input, output); + + Assert.Equal(38470, output.Length); + } + } +} \ No newline at end of file diff --git a/SabreTools.IO.Test/TestData/test-archive.msz b/SabreTools.IO.Test/TestData/test-archive.msz new file mode 100644 index 0000000000000000000000000000000000000000..d8b0984ef1af2d7c9d825331b7fe5c0b4551fe19 GIT binary patch literal 15639 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 literal 0 HcmV?d00001 diff --git a/SabreTools.IO/Compression/MSZIP/Decompressor.cs b/SabreTools.IO/Compression/MSZIP/Decompressor.cs index c2cb54c..3fd7a7c 100644 --- a/SabreTools.IO/Compression/MSZIP/Decompressor.cs +++ b/SabreTools.IO/Compression/MSZIP/Decompressor.cs @@ -42,6 +42,10 @@ namespace SabreTools.IO.Compression.MSZIP if (!dest.CanWrite) return false; + // Ignore if the end of the stream is reached + if (source.Position >= source.Length) + return false; + // Validate the header var header = new BlockHeader(); header.Signature = source.ReadUInt16LittleEndian(); @@ -49,7 +53,7 @@ namespace SabreTools.IO.Compression.MSZIP throw new InvalidDataException(nameof(source)); byte[] buffer = new byte[32 * 1024]; - var blockStream = new Deflate.DeflateStream(source, Deflate.CompressionMode.Decompress); + var blockStream = new Deflate.DeflateStream(source, Deflate.CompressionMode.Decompress, leaveOpen: true); if (_history != null) blockStream.SetDictionary(_history, check: false);