[ArchiveTools] Implement safer archive handling

This commit is contained in:
Matt Nadareski
2016-06-15 14:29:34 -07:00
parent 59c83b2dd3
commit 07aeb3f3b7

View File

@@ -105,11 +105,11 @@ namespace SabreTools.Helper
ArchiveScanLevel gz, ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger) ArchiveScanLevel gz, ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger)
{ {
bool encounteredErrors = true; bool encounteredErrors = true;
IArchive archive = null; IReader reader = null;
try try
{ {
archive = ArchiveFactory.Open(input); reader = ReaderFactory.Open(File.OpenRead(input));
ArchiveType at = archive.Type; ArchiveType at = reader.ArchiveType;
logger.Log("Found archive of type: " + at); logger.Log("Found archive of type: " + at);
if ((at == ArchiveType.Zip && zip != ArchiveScanLevel.External) || if ((at == ArchiveType.Zip && zip != ArchiveScanLevel.External) ||
@@ -117,22 +117,19 @@ namespace SabreTools.Helper
(at == ArchiveType.Rar && rar != ArchiveScanLevel.External)) (at == ArchiveType.Rar && rar != ArchiveScanLevel.External))
{ {
// Create the temp directory // Create the temp directory
DirectoryInfo di = Directory.CreateDirectory(tempdir); Directory.CreateDirectory(tempdir);
// Extract all files to the temp directory // Extract all files to the temp directory
using (IReader reader = archive.ExtractAllEntries())
{
reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath); reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath);
encounteredErrors = false; encounteredErrors = false;
} }
}
else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External) else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External)
{ {
// Close the original archive handle // Close the original archive handle
archive.Dispose(); reader.Dispose();
// Create the temp directory // Create the temp directory
DirectoryInfo di = Directory.CreateDirectory(tempdir); Directory.CreateDirectory(tempdir);
using (FileStream itemstream = File.OpenRead(input)) using (FileStream itemstream = File.OpenRead(input))
{ {
@@ -147,6 +144,10 @@ namespace SabreTools.Helper
encounteredErrors = false; encounteredErrors = false;
} }
} }
catch (EndOfStreamException)
{
// Catch this but don't count it as an error because SharpCompress is unsafe
}
catch (InvalidOperationException) catch (InvalidOperationException)
{ {
encounteredErrors = true; encounteredErrors = true;
@@ -158,7 +159,7 @@ namespace SabreTools.Helper
} }
finally finally
{ {
archive?.Dispose(); reader?.Dispose();
} }
return !encounteredErrors; return !encounteredErrors;