[ArchiveTools] Add more null checks

This commit is contained in:
Matt Nadareski
2016-10-28 17:53:27 -07:00
parent f4f96d5a78
commit 0a7d9c2d38

View File

@@ -223,6 +223,13 @@ namespace SabreTools.Helper.Tools
string realEntry = "";
Stream ms = ExtractStream(input, entryName, out realEntry, logger);
// If we got out a null or empty entry, then we don't have a stream
if (String.IsNullOrEmpty(realEntry))
{
ms.Dispose();
return null;
}
realEntry = Path.Combine(Path.GetFullPath(tempDir), realEntry);
if (!Directory.Exists(Path.GetDirectoryName(realEntry)))
{
@@ -421,10 +428,35 @@ namespace SabreTools.Helper.Tools
long size = 0;
string crc = "";
// If we have a gzip file, get the crc directly
if (at == ArchiveType.GZip)
switch (at)
{
// Get the CRC and size from the file
case ArchiveType.SevenZip:
SevenZipArchive sza = SevenZipArchive.Open(input, new ReaderOptions { LeaveStreamOpen = false });
foreach (SevenZipArchiveEntry entry in sza.Entries)
{
if (entry != null && !entry.IsDirectory)
{
logger.Verbose("Entry found: '" + entry.Key + "': "
+ (size == 0 ? entry.Size : size) + ", "
+ (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc));
roms.Add(new Rom
{
Type = ItemType.Rom,
Name = entry.Key,
Size = (size == 0 ? entry.Size : size),
CRC = (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc),
Machine = new Machine
{
Name = gamename,
},
});
}
}
break;
case ArchiveType.GZip:// Get the CRC and size from the file
BinaryReader br = new BinaryReader(File.OpenRead(input));
br.BaseStream.Seek(-8, SeekOrigin.End);
byte[] headercrc = br.ReadBytes(4);
@@ -432,9 +464,61 @@ namespace SabreTools.Helper.Tools
byte[] headersize = br.ReadBytes(4);
size = BitConverter.ToInt32(headersize.Reverse().ToArray(), 0);
br.Dispose();
}
else if (at == ArchiveType.Zip)
break;
case ArchiveType.Rar:
RarArchive ra = RarArchive.Open(input, new ReaderOptions { LeaveStreamOpen = false });
foreach (RarArchiveEntry entry in ra.Entries)
{
if (entry != null && !entry.IsDirectory)
{
logger.Verbose("Entry found: '" + entry.Key + "': "
+ (size == 0 ? entry.Size : size) + ", "
+ (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc));
roms.Add(new Rom
{
Type = ItemType.Rom,
Name = entry.Key,
Size = (size == 0 ? entry.Size : size),
CRC = (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc),
Machine = new Machine
{
Name = gamename,
},
});
}
}
break;
case ArchiveType.Tar:
TarArchive ta = TarArchive.Open(input, new ReaderOptions { LeaveStreamOpen = false });
foreach (TarArchiveEntry entry in ta.Entries)
{
if (entry != null && !entry.IsDirectory)
{
logger.Verbose("Entry found: '" + entry.Key + "': "
+ (size == 0 ? entry.Size : size) + ", "
+ (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc));
roms.Add(new Rom
{
Type = ItemType.Rom,
Name = entry.Key,
Size = (size == 0 ? entry.Size : size),
CRC = (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc),
Machine = new Machine
{
Name = gamename,
},
});
}
}
break;
case ArchiveType.Zip:
ZipFile zf = new ZipFile();
ZipReturn zr = zf.Open(input, new FileInfo(input).LastWriteTime.Ticks, true);
if (zr != ZipReturn.ZipGood)
@@ -463,58 +547,7 @@ namespace SabreTools.Helper.Tools
},
});
}
}
else if (at == ArchiveType.SevenZip)
{
SevenZipArchive sza = SevenZipArchive.Open(input, new ReaderOptions { LeaveStreamOpen = false });
foreach (SevenZipArchiveEntry entry in sza.Entries)
{
if (entry != null && !entry.IsDirectory)
{
logger.Verbose("Entry found: '" + entry.Key + "': "
+ (size == 0 ? entry.Size : size) + ", "
+ (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc));
roms.Add(new Rom
{
Type = ItemType.Rom,
Name = entry.Key,
Size = (size == 0 ? entry.Size : size),
CRC = (crc == "" ? entry.Crc.ToString("X").ToLowerInvariant() : crc),
Machine = new Machine
{
Name = gamename,
},
});
}
}
}
else if (at != ArchiveType.Tar)
{
reader = ReaderFactory.Open(File.OpenRead(input));
while (reader.MoveToNextEntry())
{
if (reader.Entry != null && !reader.Entry.IsDirectory)
{
logger.Verbose("Entry found: '" + reader.Entry.Key + "': "
+ (size == 0 ? reader.Entry.Size : size) + ", "
+ (crc == "" ? reader.Entry.Crc.ToString("X").ToLowerInvariant() : crc));
roms.Add(new Rom
{
Type = ItemType.Rom,
Name = reader.Entry.Key,
Size = (size == 0 ? reader.Entry.Size : size),
CRC = (crc == "" ? reader.Entry.Crc.ToString("X").ToLowerInvariant() : crc),
Machine = new Machine
{
Name = gamename,
},
});
}
}
break;
}
}
catch (Exception ex)
@@ -1169,6 +1202,12 @@ namespace SabreTools.Helper.Tools
bool success = false;
string tempFile = Path.GetTempFileName();
// If either list of roms is null or empty, return
if (inputFiles == null || roms == null || inputFiles.Count == 0 || roms.Count == 0)
{
return success;
}
// If the number of inputs is less than the number of available roms, return
if (inputFiles.Count < roms.Count)
{