From 39b07f45f1f43a922632b16872539716c7e6a8ac Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 25 Jun 2020 09:16:15 +0100 Subject: [PATCH 1/7] Update github action and minor SDK bump --- .github/workflows/dotnetcore.yml | 4 ++-- global.json | 2 +- tests/SharpCompress.Test/SharpCompress.Test.csproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 96f99488..c28c5f9c 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -1,5 +1,5 @@ name: SharpCompress -on: [push] +on: [push, pull_request] jobs: build: @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v1 - uses: actions/setup-dotnet@v1 with: - dotnet-version: 3.1.300 + dotnet-version: 3.1.301 - run: dotnet run -p src/build/build.csproj - uses: actions/upload-artifact@v2 with: diff --git a/global.json b/global.json index 9ee6c25f..c120c811 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.1.300" + "version": "3.1.301" } } \ No newline at end of file diff --git a/tests/SharpCompress.Test/SharpCompress.Test.csproj b/tests/SharpCompress.Test/SharpCompress.Test.csproj index 5de24b26..47651102 100644 --- a/tests/SharpCompress.Test/SharpCompress.Test.csproj +++ b/tests/SharpCompress.Test/SharpCompress.Test.csproj @@ -13,7 +13,7 @@ - + From 233dc33130e3b609006c70fe12e9ba09c11151ea Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 25 Jun 2020 09:22:15 +0100 Subject: [PATCH 2/7] Fix running tests on build --- src/build/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/build/Program.cs b/src/build/Program.cs index 4ff50041..b889a2f1 100644 --- a/src/build/Program.cs +++ b/src/build/Program.cs @@ -57,7 +57,7 @@ class Program return Glob.Files(".", d); } - foreach (var file in GetFiles("*.Tests/**/*.csproj")) + foreach (var file in GetFiles("**/*.Test.csproj")) { Run("dotnet", $"test {file} -c Release -f {framework} --no-restore --no-build"); } From de6759a83fd06ad1684a552bbfc38b0df75c2c0f Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Wed, 1 Jul 2020 15:06:54 +0500 Subject: [PATCH 3/7] - remove check of solid archive - change tests - add test on multi solid archive --- .../Archives/IArchiveEntryExtensions.cs | 5 ---- .../Archives/Rar/RarArchiveEntry.cs | 5 ---- tests/SharpCompress.Test/ArchiveTests.cs | 6 ---- .../SharpCompress.Test/Rar/RarArchiveTests.cs | 28 +++++++++++++----- .../Archives/Rar.multi.solid.part01.rar | Bin 0 -> 10240 bytes .../Archives/Rar.multi.solid.part02.rar | Bin 0 -> 10240 bytes .../Archives/Rar.multi.solid.part03.rar | Bin 0 -> 10240 bytes .../Archives/Rar.multi.solid.part04.rar | Bin 0 -> 10240 bytes .../Archives/Rar.multi.solid.part05.rar | Bin 0 -> 10240 bytes .../Archives/Rar.multi.solid.part06.rar | Bin 0 -> 9931 bytes 10 files changed, 20 insertions(+), 24 deletions(-) create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part01.rar create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part02.rar create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part03.rar create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part04.rar create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part05.rar create mode 100644 tests/TestArchives/Archives/Rar.multi.solid.part06.rar diff --git a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs index 48c6c38a..0e9e4041 100644 --- a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs @@ -8,11 +8,6 @@ namespace SharpCompress.Archives { public static void WriteTo(this IArchiveEntry archiveEntry, Stream streamToWriteTo) { - if (archiveEntry.Archive.Type == ArchiveType.Rar && archiveEntry.Archive.IsSolid) - { - throw new InvalidFormatException("Cannot use Archive random access on SOLID Rar files."); - } - if (archiveEntry.IsDirectory) { throw new ExtractionException("Entry is a file directory and cannot be extracted."); diff --git a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs index 3f2360b2..cb4fb169 100644 --- a/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs +++ b/src/SharpCompress/Archives/Rar/RarArchiveEntry.cs @@ -57,11 +57,6 @@ namespace SharpCompress.Archives.Rar public Stream OpenEntryStream() { - if (archive.IsSolid) - { - throw new InvalidOperationException("Use ExtractAllEntries to extract SOLID archives."); - } - if (IsRarV3) { return new RarStream(archive.UnpackV1.Value, FileHeader, new MultiVolumeReadOnlyStream(Parts.Cast(), archive)); diff --git a/tests/SharpCompress.Test/ArchiveTests.cs b/tests/SharpCompress.Test/ArchiveTests.cs index c75aab72..cfa247e5 100644 --- a/tests/SharpCompress.Test/ArchiveTests.cs +++ b/tests/SharpCompress.Test/ArchiveTests.cs @@ -83,12 +83,6 @@ namespace SharpCompress.Test }); } } - catch (InvalidFormatException) - { - //rar SOLID test needs this - stream.ThrowOnDispose = false; - throw; - } catch (IndexOutOfRangeException) { //SevenZipArchive_BZip2_Split test needs this diff --git a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs index 05ee1bb0..b521bd5c 100644 --- a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs +++ b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs @@ -203,13 +203,13 @@ namespace SharpCompress.Test.Rar [Fact] public void Rar_Solid_ArchiveStreamRead() { - Assert.Throws(() => ArchiveStreamRead("Rar.solid.rar")); + ArchiveStreamRead("Rar.solid.rar"); } [Fact] public void Rar5_Solid_ArchiveStreamRead() { - Assert.Throws(() => ArchiveStreamRead("Rar5.solid.rar")); + ArchiveStreamRead("Rar5.solid.rar"); } [Fact] @@ -232,7 +232,7 @@ namespace SharpCompress.Test.Rar "Rar.multi.part03.rar", "Rar.multi.part04.rar", "Rar.multi.part05.rar", - "Rar.multi.part06.rar"}); + "Rar.multi.part06.rar"}, false); } [Fact] @@ -243,14 +243,15 @@ namespace SharpCompress.Test.Rar "Rar5.multi.part03.rar", "Rar5.multi.part04.rar", "Rar5.multi.part05.rar", - "Rar5.multi.part06.rar"}); + "Rar5.multi.part06.rar"}, false); } - private void DoRar_Multi_ArchiveStreamRead(string[] archives) + private void DoRar_Multi_ArchiveStreamRead(string[] archives, bool isSolid) { using (var archive = RarArchive.Open(archives.Select(s => Path.Combine(TEST_ARCHIVES_PATH, s)) .Select(File.OpenRead))) { + Assert.Equal(archive.IsSolid, isSolid); foreach (var entry in archive.Entries.Where(entry => !entry.IsDirectory)) { entry.WriteToDirectory(SCRATCH_FILES_PATH, new ExtractionOptions() @@ -260,7 +261,18 @@ namespace SharpCompress.Test.Rar }); } } - VerifyFiles(); + } + + [Fact] + public void Rar5_MultiSolid_Extract_All() + { + DoRar_Multi_ArchiveStreamRead(new string[] { + "Rar.multi.solid.part01.rar", + "Rar.multi.solid.part02.rar", + "Rar.multi.solid.part03.rar", + "Rar.multi.solid.part04.rar", + "Rar.multi.solid.part05.rar", + "Rar.multi.solid.part06.rar"}, true); } [Fact] @@ -332,13 +344,13 @@ namespace SharpCompress.Test.Rar [Fact] public void Rar_Solid_ArchiveFileRead() { - Assert.Throws(() => ArchiveFileRead("Rar.solid.rar")); + ArchiveFileRead("Rar.solid.rar"); } [Fact] public void Rar5_Solid_ArchiveFileRead() { - Assert.Throws(() => ArchiveFileRead("Rar5.solid.rar")); + ArchiveFileRead("Rar5.solid.rar"); } [Fact] diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part01.rar b/tests/TestArchives/Archives/Rar.multi.solid.part01.rar new file mode 100644 index 0000000000000000000000000000000000000000..e018c9d217382a5f021f7bfd848fc5d48b68f84d GIT binary patch literal 10240 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 literal 0 HcmV?d00001 diff --git a/tests/TestArchives/Archives/Rar.multi.solid.part04.rar b/tests/TestArchives/Archives/Rar.multi.solid.part04.rar new file mode 100644 index 0000000000000000000000000000000000000000..0f78edfed4acedcd2aee758b319794694c95c491 GIT binary patch literal 10240 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 R>?vGnCR-jB$jr*Z0076ULLC4A literal 0 HcmV?d00001 From 81997fe1bab112549d2eb0c8ac2a9e7c5035b22d Mon Sep 17 00:00:00 2001 From: Dmitriy Date: Wed, 1 Jul 2020 15:10:21 +0500 Subject: [PATCH 4/7] rename test --- tests/SharpCompress.Test/Rar/RarArchiveTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs index b521bd5c..71917bd9 100644 --- a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs +++ b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs @@ -264,7 +264,7 @@ namespace SharpCompress.Test.Rar } [Fact] - public void Rar5_MultiSolid_Extract_All() + public void Rar5_MultiSolid_ArchiveStreamRead() { DoRar_Multi_ArchiveStreamRead(new string[] { "Rar.multi.solid.part01.rar", From 4354e82bb586658e4d999ffee37478f74bfbf433 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 16 Jul 2020 14:28:37 +0100 Subject: [PATCH 5/7] =?UTF-8?q?Don=E2=80=99t=20use=20437=20Encoding=20by?= =?UTF-8?q?=20default=20anymore.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/SharpCompress/Common/ArchiveEncoding.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SharpCompress/Common/ArchiveEncoding.cs b/src/SharpCompress/Common/ArchiveEncoding.cs index e2c0247b..1f0b6eff 100644 --- a/src/SharpCompress/Common/ArchiveEncoding.cs +++ b/src/SharpCompress/Common/ArchiveEncoding.cs @@ -27,9 +27,13 @@ namespace SharpCompress.Common public Func? CustomDecoder { get; set; } public ArchiveEncoding() + : this(Encoding.Default, Encoding.Default) { - Default = Encoding.GetEncoding(437); - Password = Encoding.GetEncoding(437); + } + public ArchiveEncoding(Encoding def, Encoding password) + { + Default = def; + Password = password; } #if NETSTANDARD1_3 || NETSTANDARD2_0 || NETSTANDARD2_1 From b7f635f54065aebf633b2759674e299e28ef835c Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 16 Jul 2020 15:35:27 +0100 Subject: [PATCH 6/7] Update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 437b894e..24b16aa5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SharpCompress -SharpCompress is a compression library in pure C# for .NET Standard 1.3 and 2.0 that can unrar, un7zip, unzip, untar unbzip2 and ungzip with forward-only reading and file random access APIs. Write support for zip/tar/bzip2/gzip are implemented. +SharpCompress is a compression library in pure C# for .NET Standard 1.3 and 2.0 that can unrar, un7zip, unzip, untar unbzip2, ungzip, unlzip with forward-only reading and file random access APIs. Write support for zip/tar/bzip2/gzip/lzip are implemented. The major feature is support for non-seekable streams so large files can be processed on the fly (i.e. download stream). From d055b34efec7aafcf95a97ec2b4d671826469464 Mon Sep 17 00:00:00 2001 From: Daniel Nash Date: Mon, 20 Jul 2020 12:57:39 -0400 Subject: [PATCH 7/7] Ensure TarArchive enumerates all entries While enumerating the entries of a tar file and writing their contents to disk using TarArchive, it was discovered TarArchive was not properly discarding padding bytes in the last block of each entry. TarArchive was sometimes able to recover depending on the number of padding bytes due to the logic it uses to find the next entry header, but not always. TarArchive was changed to use TarReadOnlySubStream when opening entries and TarReadOnlySubstream was changed to ensure all an entry's blocks are read when it is being disposed. Fixes adamhathcock/sharpcompress#524 --- src/SharpCompress/Common/Tar/TarFilePart.cs | 2 +- .../Common/Tar/TarReadOnlySubStream.cs | 22 +++++----- .../SharpCompress.Test/Tar/TarArchiveTests.cs | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/SharpCompress/Common/Tar/TarFilePart.cs b/src/SharpCompress/Common/Tar/TarFilePart.cs index f1a56216..2e11db3d 100644 --- a/src/SharpCompress/Common/Tar/TarFilePart.cs +++ b/src/SharpCompress/Common/Tar/TarFilePart.cs @@ -24,7 +24,7 @@ namespace SharpCompress.Common.Tar if (_seekableStream != null) { _seekableStream.Position = Header.DataStartPosition!.Value; - return new ReadOnlySubStream(_seekableStream, Header.Size); + return new TarReadOnlySubStream(_seekableStream, Header.Size); } return Header.PackedStream; } diff --git a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs index ed808d42..f0782c6e 100644 --- a/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs +++ b/src/SharpCompress/Common/Tar/TarReadOnlySubStream.cs @@ -20,22 +20,24 @@ namespace SharpCompress.Common.Tar { return; } + _isDisposed = true; + if (disposing) { - long skipBytes = _amountRead % 512; - if (skipBytes == 0) + // Ensure we read all remaining blocks for this entry. + Stream.Skip(BytesLeftToRead); + _amountRead += BytesLeftToRead; + + // If the last block wasn't a full 512 bytes, skip the remaining padding bytes. + var bytesInLastBlock = _amountRead % 512; + + if (bytesInLastBlock != 0) { - return; + Stream.Skip(512 - bytesInLastBlock); } - skipBytes = 512 - skipBytes; - if (skipBytes == 0) - { - return; - } - var buffer = new byte[skipBytes]; - Stream.ReadFully(buffer); } + base.Dispose(disposing); } diff --git a/tests/SharpCompress.Test/Tar/TarArchiveTests.cs b/tests/SharpCompress.Test/Tar/TarArchiveTests.cs index a03bb64e..69ae3058 100644 --- a/tests/SharpCompress.Test/Tar/TarArchiveTests.cs +++ b/tests/SharpCompress.Test/Tar/TarArchiveTests.cs @@ -248,5 +248,45 @@ namespace SharpCompress.Test.Tar } } } + + [Fact] + public void Tar_Read_One_At_A_Time() + { + var archiveEncoding = new ArchiveEncoding { Default = Encoding.UTF8, }; + var tarWriterOptions = new TarWriterOptions(CompressionType.None, true) { ArchiveEncoding = archiveEncoding, }; + var testBytes = Encoding.UTF8.GetBytes("This is a test."); + + using (var memoryStream = new MemoryStream()) + { + using (var tarWriter = new TarWriter(memoryStream, tarWriterOptions)) + using (var testFileStream = new MemoryStream(testBytes)) + { + tarWriter.Write("test1.txt", testFileStream); + testFileStream.Position = 0; + tarWriter.Write("test2.txt", testFileStream); + } + + memoryStream.Position = 0; + + var numberOfEntries = 0; + + using (var archiveFactory = TarArchive.Open(memoryStream)) + { + foreach (var entry in archiveFactory.Entries) + { + ++numberOfEntries; + + using (var tarEntryStream = entry.OpenEntryStream()) + using (var testFileStream = new MemoryStream()) + { + tarEntryStream.CopyTo(testFileStream); + Assert.Equal(testBytes.Length, testFileStream.Length); + } + } + } + + Assert.Equal(2, numberOfEntries); + } + } } }