diff --git a/src/SharpCompress/Archives/ArchiveFactory.Async.cs b/src/SharpCompress/Archives/ArchiveFactory.Async.cs index 39ac2795..6518952f 100644 --- a/src/SharpCompress/Archives/ArchiveFactory.Async.cs +++ b/src/SharpCompress/Archives/ArchiveFactory.Async.cs @@ -92,15 +92,13 @@ public static partial class ArchiveFactory ) { cancellationToken.ThrowIfCancellationRequested(); - streams.NotNull(nameof(streams)); - var streamsArray = streams; + var streamsArray = streams.RequireReadable(); + streamsArray.RequireSeekable(); if (streamsArray.Count == 0) { throw new ArchiveOperationException("No streams"); } - streamsArray.RequireSeekable(); - var firstStream = streamsArray[0]; if (streamsArray.Count == 1) { diff --git a/src/SharpCompress/Archives/ArchiveFactory.cs b/src/SharpCompress/Archives/ArchiveFactory.cs index eb7a6815..7f1834d1 100644 --- a/src/SharpCompress/Archives/ArchiveFactory.cs +++ b/src/SharpCompress/Archives/ArchiveFactory.cs @@ -73,15 +73,13 @@ public static partial class ArchiveFactory public static IArchive OpenArchive(IReadOnlyList streams, ReaderOptions? options = null) { - streams.NotNull(nameof(streams)); - var streamsArray = streams; + var streamsArray = streams.RequireReadable(); + streamsArray.RequireSeekable(); if (streamsArray.Count == 0) { throw new ArchiveOperationException("No streams"); } - streamsArray.RequireSeekable(); - var firstStream = streamsArray[0]; if (streamsArray.Count == 1) { diff --git a/src/SharpCompress/Archives/GZip/GZipArchive.Factory.cs b/src/SharpCompress/Archives/GZip/GZipArchive.Factory.cs index c7f57f88..9caa068e 100644 --- a/src/SharpCompress/Archives/GZip/GZipArchive.Factory.cs +++ b/src/SharpCompress/Archives/GZip/GZipArchive.Factory.cs @@ -76,9 +76,8 @@ public partial class GZipArchive ReaderOptions? readerOptions = null ) { - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); return new GZipArchive( new SourceStream( strms[0], @@ -93,6 +92,7 @@ public partial class GZipArchive ReaderOptions? readerOptions = null ) { + stream.RequireReadable(); stream.RequireSeekable(); return new GZipArchive( diff --git a/src/SharpCompress/Archives/Rar/RarArchive.Factory.cs b/src/SharpCompress/Archives/Rar/RarArchive.Factory.cs index b97e7497..31d53b0a 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.Factory.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.Factory.cs @@ -58,6 +58,7 @@ public partial class RarArchive public static IRarArchive OpenArchive(Stream stream, ReaderOptions? readerOptions = null) { + stream.RequireReadable(); stream.RequireSeekable(); return new RarArchive( @@ -86,9 +87,8 @@ public partial class RarArchive ReaderOptions? readerOptions = null ) { - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); return new RarArchive( new SourceStream( strms[0], diff --git a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.Factory.cs b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.Factory.cs index e15354b1..161b0ed2 100644 --- a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.Factory.cs +++ b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.Factory.cs @@ -71,9 +71,8 @@ public partial class SevenZipArchive ReaderOptions? readerOptions = null ) { - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); return new SevenZipArchive( new SourceStream( strms[0], @@ -85,6 +84,7 @@ public partial class SevenZipArchive public static IArchive OpenArchive(Stream stream, ReaderOptions? readerOptions = null) { + stream.RequireReadable(); stream.RequireSeekable(); return new SevenZipArchive( diff --git a/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs b/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs index 5eacb117..9d60a6e8 100644 --- a/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs +++ b/src/SharpCompress/Archives/Tar/TarArchive.Factory.cs @@ -66,9 +66,8 @@ public partial class TarArchive ReaderOptions? readerOptions = null ) { - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); var sourceStream = new SourceStream( strms[0], i => i < strms.Count ? strms[i] : null, @@ -87,6 +86,7 @@ public partial class TarArchive ReaderOptions? readerOptions = null ) { + stream.RequireReadable(); stream.RequireSeekable(); return OpenArchive([stream], readerOptions); @@ -98,7 +98,7 @@ public partial class TarArchive CancellationToken cancellationToken = default ) { - stream.NotNull(nameof(stream)); + stream.RequireReadable(); stream.RequireSeekable(); var sourceStream = new SourceStream( stream, @@ -155,9 +155,8 @@ public partial class TarArchive ) { cancellationToken.ThrowIfCancellationRequested(); - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); var sourceStream = new SourceStream( strms[0], i => i < strms.Count ? strms[i] : null, diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.Factory.cs b/src/SharpCompress/Archives/Zip/ZipArchive.Factory.cs index d83d00e1..a015272a 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.Factory.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.Factory.cs @@ -67,9 +67,8 @@ public partial class ZipArchive ReaderOptions? readerOptions = null ) { - streams.NotNull(nameof(streams)); - streams.RequireSeekable(); - var strms = streams; + var strms = streams.RequireReadable(); + strms.RequireSeekable(); return new ZipArchive( new SourceStream( strms[0], @@ -84,6 +83,7 @@ public partial class ZipArchive ReaderOptions? readerOptions = null ) { + stream.RequireReadable(); stream.RequireSeekable(); return new ZipArchive( @@ -128,7 +128,6 @@ public partial class ZipArchive ) { cancellationToken.ThrowIfCancellationRequested(); - streams.RequireSeekable(); return new((IWritableAsyncArchive)OpenArchive(streams, readerOptions)); } diff --git a/tests/SharpCompress.Test/ArchiveFactoryTests.cs b/tests/SharpCompress.Test/ArchiveFactoryTests.cs index af5ab692..d6326bad 100644 --- a/tests/SharpCompress.Test/ArchiveFactoryTests.cs +++ b/tests/SharpCompress.Test/ArchiveFactoryTests.cs @@ -93,6 +93,24 @@ public class ArchiveFactoryTests : TestBase ); } + [Fact] + public void OpenArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + Assert.Throws(() => ArchiveFactory.OpenArchive(unreadable)); + } + + [Fact] + public async ValueTask OpenAsyncArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + await Assert.ThrowsAsync(() => + ArchiveFactory.OpenAsyncArchive(unreadable).AsTask() + ); + } + [Theory] [InlineData("Zip.deflate.zip", ArchiveType.Zip)] [InlineData("Tar.noEmptyDirs.tar", ArchiveType.Tar)] diff --git a/tests/SharpCompress.Test/GZip/GZipArchiveTests.cs b/tests/SharpCompress.Test/GZip/GZipArchiveTests.cs index 59e8b4fe..5f9f5094 100644 --- a/tests/SharpCompress.Test/GZip/GZipArchiveTests.cs +++ b/tests/SharpCompress.Test/GZip/GZipArchiveTests.cs @@ -137,6 +137,14 @@ public class GZipArchiveTests : ArchiveTests Assert.Throws(() => GZipArchive.OpenArchive([nonSeekable, seekable])); } + [Fact] + public void GZipArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + Assert.Throws(() => GZipArchive.OpenArchive(unreadable)); + } + [Fact] public void GZip_Archive_NonSeekableStream() { diff --git a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs index d13660c6..c4ef386c 100644 --- a/tests/SharpCompress.Test/Rar/RarArchiveTests.cs +++ b/tests/SharpCompress.Test/Rar/RarArchiveTests.cs @@ -131,6 +131,14 @@ public class RarArchiveTests : ArchiveTests Assert.Throws(() => RarArchive.OpenArchive([nonSeekable, seekable])); } + [Fact] + public void RarArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + Assert.Throws(() => RarArchive.OpenArchive(unreadable)); + } + [Fact] public void Rar5_ArchiveStreamRead() => ArchiveStreamRead("Rar5.rar"); diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs index f16036df..0fc86c3e 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipArchiveTests.cs @@ -37,6 +37,14 @@ public class SevenZipArchiveTests : ArchiveTests ); } + [Fact] + public void SevenZipArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + Assert.Throws(() => SevenZipArchive.OpenArchive(unreadable)); + } + [Fact] public void SevenZipArchive_LZMAAES_StreamRead() => ArchiveStreamRead( diff --git a/tests/SharpCompress.Test/Tar/TarArchiveAsyncTests.cs b/tests/SharpCompress.Test/Tar/TarArchiveAsyncTests.cs index 0ab211f4..a2c06516 100644 --- a/tests/SharpCompress.Test/Tar/TarArchiveAsyncTests.cs +++ b/tests/SharpCompress.Test/Tar/TarArchiveAsyncTests.cs @@ -32,6 +32,16 @@ public class TarArchiveAsyncTests : ArchiveTests ); } + [Fact] + public async ValueTask TarArchiveOpenAsyncStream_Throws_On_Unreadable_Stream() + { + using var stream = new TestStream(new MemoryStream(), false, true, true); + + await Assert.ThrowsAsync(() => + TarArchive.OpenAsyncArchive(stream).AsTask() + ); + } + [Fact] public async ValueTask Tar_FileName_Exactly_100_Characters_Async() { diff --git a/tests/SharpCompress.Test/Tar/TarArchiveTests.cs b/tests/SharpCompress.Test/Tar/TarArchiveTests.cs index a0dcd87a..5f522e7c 100644 --- a/tests/SharpCompress.Test/Tar/TarArchiveTests.cs +++ b/tests/SharpCompress.Test/Tar/TarArchiveTests.cs @@ -34,6 +34,19 @@ public class TarArchiveTests : ArchiveTests Assert.Throws(() => ArchiveFactory.OpenArchive(stream)); } + [Fact] + public void TarArchiveStreamRead_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream( + File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar")), + false, + true, + true + ); + + Assert.Throws(() => TarArchive.OpenArchive(unreadable)); + } + [Fact] public void TarArchive_StreamCollection_Throws_On_NonSeekable_Stream() { diff --git a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs index 8f4d4a20..ca80917f 100644 --- a/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/tests/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -7,6 +7,7 @@ using SharpCompress.Archives.Zip; using SharpCompress.Common; using SharpCompress.Common.Zip; using SharpCompress.Readers; +using SharpCompress.Test.Mocks; using SharpCompress.Writers; using SharpCompress.Writers.Zip; using Xunit; @@ -37,6 +38,14 @@ public class ZipArchiveTests : ArchiveTests Assert.Throws(() => ZipArchive.OpenArchive([nonSeekable, seekable])); } + [Fact] + public void ZipArchive_Stream_Throws_On_Unreadable_Stream() + { + using var unreadable = new TestStream(new MemoryStream(), false, true, true); + + Assert.Throws(() => ZipArchive.OpenArchive(unreadable)); + } + [Fact] public void Zip_Deflate_Streamed2_ArchiveStreamRead() => ArchiveStreamRead("Zip.deflate.dd-.zip");