diff --git a/SharpCompress.Test/Tar/TarArchiveTests.cs b/SharpCompress.Test/Tar/TarArchiveTests.cs index b7a8124c..72a1e1ab 100644 --- a/SharpCompress.Test/Tar/TarArchiveTests.cs +++ b/SharpCompress.Test/Tar/TarArchiveTests.cs @@ -145,5 +145,16 @@ namespace SharpCompress.Test } CompareArchivesByPath(modified, scratchPath); } + + [TestMethod] + public void Tar_Containing_Rar_Archive() + { + string archiveFullPath = Path.Combine(TEST_ARCHIVES_PATH, "Tar.ContainsRar.tar"); + using (Stream stream = File.OpenRead(archiveFullPath)) + using (IArchive archive = ArchiveFactory.Open(stream)) + { + Assert.IsTrue(archive.Type == ArchiveType.Tar); + } + } } } diff --git a/SharpCompress.Test/Tar/TarReaderTests.cs b/SharpCompress.Test/Tar/TarReaderTests.cs index 69963df5..af8e63bd 100644 --- a/SharpCompress.Test/Tar/TarReaderTests.cs +++ b/SharpCompress.Test/Tar/TarReaderTests.cs @@ -2,6 +2,7 @@ using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using SharpCompress.Common; +using SharpCompress.Reader; using SharpCompress.Reader.Tar; namespace SharpCompress.Test @@ -88,5 +89,16 @@ namespace SharpCompress.Test Assert.AreEqual(names.Count, 3); } } + + [TestMethod] + public void Tar_Containing_Rar_Reader() + { + string archiveFullPath = Path.Combine(TEST_ARCHIVES_PATH, "Tar.ContainsRar.tar"); + using (Stream stream = File.OpenRead(archiveFullPath)) + using (IReader reader = ReaderFactory.Open(stream)) + { + Assert.IsTrue(reader.ArchiveType == ArchiveType.Tar); + } + } } } diff --git a/SharpCompress/Archive/ArchiveFactory.cs b/SharpCompress/Archive/ArchiveFactory.cs index 278e9e10..8dddbe82 100644 --- a/SharpCompress/Archive/ArchiveFactory.cs +++ b/SharpCompress/Archive/ArchiveFactory.cs @@ -43,7 +43,7 @@ namespace SharpCompress.Archive return GZipArchive.Open(stream, options); } stream.Seek(0, SeekOrigin.Begin); - if(RarArchive.IsRarFile(stream, Options.LookForHeader | Options.KeepStreamsOpen)) + if (RarArchive.IsRarFile(stream, options)) { stream.Seek(0, SeekOrigin.Begin); return RarArchive.Open(stream, options); @@ -138,7 +138,7 @@ namespace SharpCompress.Archive return GZipArchive.Open(fileInfo, options); } stream.Seek(0, SeekOrigin.Begin); - if(RarArchive.IsRarFile(stream, Options.LookForHeader | Options.KeepStreamsOpen)) + if (RarArchive.IsRarFile(stream, options)) { stream.Dispose(); return RarArchive.Open(fileInfo, options); diff --git a/SharpCompress/Archive/Rar/RarArchive.cs b/SharpCompress/Archive/Rar/RarArchive.cs index f7f88b39..0eff6bc5 100644 --- a/SharpCompress/Archive/Rar/RarArchive.cs +++ b/SharpCompress/Archive/Rar/RarArchive.cs @@ -152,12 +152,8 @@ namespace SharpCompress.Archive.Rar try { var headerFactory = new RarHeaderFactory(StreamingMode.Seekable, options); - RarHeader header = headerFactory.ReadHeaders(stream).FirstOrDefault(); - if (header == null) - { - return false; - } - return Enum.IsDefined(typeof (HeaderType), header.HeaderType); + var markHeader = headerFactory.ReadHeaders(stream).FirstOrDefault() as MarkHeader; + return markHeader != null && markHeader.IsValid(); } catch { diff --git a/SharpCompress/Common/Rar/Headers/MarkHeader.cs b/SharpCompress/Common/Rar/Headers/MarkHeader.cs index 41214b46..9df32170 100644 --- a/SharpCompress/Common/Rar/Headers/MarkHeader.cs +++ b/SharpCompress/Common/Rar/Headers/MarkHeader.cs @@ -10,48 +10,15 @@ namespace SharpCompress.Common.Rar.Headers internal bool IsValid() { - if (!(HeadCRC == 0x6152)) - { - return false; - } - if (!(HeaderType == HeaderType.MarkHeader)) - { - return false; - } - if (!(Flags == 0x1a21)) - { - return false; - } - if (!(HeaderSize == BaseBlockSize)) - { - return false; - } - return true; - } + // Rar old signature: 52 45 7E 5E (not supported) - internal bool IsSignature() - { - bool valid = false; - /*byte[] d = new byte[BaseBlock.BaseBlockSize]; - BinaryWriter writer = new BinaryWriter(); - writer.Write(HeadCRC); - writer.Write((byte)HeaderType); - writer.Write(flags); - writer.Write(HeaderSize); - writer.Flush - - if (d[0] == 0x52) { - if (d[1]==0x45 && d[2]==0x7e && d[3]==0x5e) { - oldFormat=true; - valid=true; - } - else if (d[1]==0x61 && d[2]==0x72 && d[3]==0x21 && d[4]==0x1a && - d[5]==0x07 && d[6]==0x00) { - oldFormat=false; - valid=true; - } - }*/ - return valid; + // Rar4 signature: 52 61 72 21 1A 07 00 + return HeadCRC == 0x6152 && + HeaderType == HeaderType.MarkHeader && + Flags == 0x1A21 && + HeaderSize == 0x07; + + // Rar5 signature: 52 61 72 21 1A 07 10 00 (not supported yet) } internal bool OldFormat { get; private set; } diff --git a/TestArchives/Archives/Tar.ContainsRar.tar b/TestArchives/Archives/Tar.ContainsRar.tar new file mode 100644 index 00000000..621ab2ab Binary files /dev/null and b/TestArchives/Archives/Tar.ContainsRar.tar differ