Merge pull request #121 from benshoof/rar_detection_fix

Fix false positives in Rar file detection
This commit is contained in:
Adam Hathcock
2016-01-26 11:54:07 +00:00
6 changed files with 35 additions and 49 deletions

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);

View File

@@ -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
{

View File

@@ -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; }

Binary file not shown.