From eede5aa9cc28ccde305df21c5a0e87b1a26cfb7b Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 8 Dec 2025 10:45:50 +0000 Subject: [PATCH] Should not throw on ARJ detection --- src/SharpCompress/Factories/ArjFactory.cs | 13 ++++++++--- tests/SharpCompress.Test/ArchiveTests.cs | 27 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/SharpCompress/Factories/ArjFactory.cs b/src/SharpCompress/Factories/ArjFactory.cs index 7499946b..4b9fc5bb 100644 --- a/src/SharpCompress/Factories/ArjFactory.cs +++ b/src/SharpCompress/Factories/ArjFactory.cs @@ -28,12 +28,19 @@ namespace SharpCompress.Factories int bufferSize = ReaderOptions.DefaultBufferSize ) { - var arjHeader = new ArjMainHeader(new ArchiveEncoding()); - if (arjHeader.Read(stream) == null) + try + { + var arjHeader = new ArjMainHeader(new ArchiveEncoding()); + if (arjHeader.Read(stream) == null) + { + return false; + } + return true; + } + catch { return false; } - return true; } public IReader OpenReader(Stream stream, ReaderOptions? options) => diff --git a/tests/SharpCompress.Test/ArchiveTests.cs b/tests/SharpCompress.Test/ArchiveTests.cs index 2f47e121..e6771ba3 100644 --- a/tests/SharpCompress.Test/ArchiveTests.cs +++ b/tests/SharpCompress.Test/ArchiveTests.cs @@ -654,4 +654,31 @@ public class ArchiveTests : ReaderTests Assert.Equal(3, archive.Entries.Count()); } } + + [Fact] + public void ArchiveFactory_IsArchive_NonArchiveFile_ShouldReturnFalse() + { + // Test that ArchiveFactory.IsArchive returns false instead of throwing + // when called on a non-archive file (regression test for issue #1060) + using (var stream = new MemoryStream(new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04 })) + { + var result = ArchiveFactory.IsArchive(stream, out var type); + Assert.False(result); + Assert.Null(type); + } + } + + [Fact] + public void ArchiveFactory_IsArchive_ValidArchive_ShouldReturnTrue() + { + // Test that ArchiveFactory.IsArchive correctly identifies valid archives + var testArchive = Path.Combine(TEST_ARCHIVES_PATH, "Zip.bzip2.noEmptyDirs.zip"); + + using (var stream = File.OpenRead(testArchive)) + { + var result = ArchiveFactory.IsArchive(stream, out var type); + Assert.True(result); + Assert.Equal(ArchiveType.Zip, type); + } + } }