From 0f2194475507c7e8b58d850ec37de10bdaa5bfe9 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Fri, 22 Jan 2021 07:51:04 +1000 Subject: [PATCH] Fix NRE when enumerating archive members to HawkArchiveFileItems SharpCompress does this for .tar.gz it seems --- .../SharpCompressArchiveFile.cs | 13 ++++++++++--- src/BizHawk.Common/HawkFile/HawkFile.cs | 9 ++++++++- src/BizHawk.Common/HawkFile/IHawkArchiveFile.cs | 3 ++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/BizHawk.Client.Common/SharpCompressArchiveFile.cs b/src/BizHawk.Client.Common/SharpCompressArchiveFile.cs index c42e32a7ef..7cf94c7a6c 100644 --- a/src/BizHawk.Client.Common/SharpCompressArchiveFile.cs +++ b/src/BizHawk.Client.Common/SharpCompressArchiveFile.cs @@ -39,10 +39,17 @@ namespace BizHawk.Client.Common entryStream.CopyTo(stream); } - public List Scan() + public List? Scan() { - var files = EnumerateArchiveFiles(); - return files.Select((e, i) => new HawkArchiveFileItem(e.Key.Replace('\\', '/'), e.Size, i, i)).ToList(); + List outFiles = new(); + var entries = EnumerateArchiveFiles().ToList(); + for (var i = 0; i < entries.Count; i++) + { + var entry = entries[i]; + if (entry.Key == null) return null; + outFiles.Add(new HawkArchiveFileItem(entry.Key.Replace('\\', '/'), entry.Size, i, i)); + } + return outFiles; } } } diff --git a/src/BizHawk.Common/HawkFile/HawkFile.cs b/src/BizHawk.Common/HawkFile/HawkFile.cs index 14918ebdd8..e5db2da79f 100644 --- a/src/BizHawk.Common/HawkFile/HawkFile.cs +++ b/src/BizHawk.Common/HawkFile/HawkFile.cs @@ -102,11 +102,12 @@ namespace BizHawk.Common _extractor = DearchivalMethod.Construct(path); try { - _archiveItems = _extractor.Scan(); + _archiveItems = _extractor.Scan() ?? throw new NullReferenceException(); IsArchive = true; } catch { + Console.WriteLine($"Failed to scan file list of {FullPathWithoutMember}"); _archiveItems = null; _extractor.Dispose(); _extractor = null; @@ -132,6 +133,12 @@ namespace BizHawk.Common if (_extractor != null) { var scanResults = _extractor.Scan(); + if (scanResults == null) + { + Console.WriteLine($"Failed to scan file list of {FullPathWithoutMember}"); + Exists = false; + return; + } for (int i = 0, l = scanResults.Count; i < l; i++) { if (string.Equals(scanResults[i].Name, autobind, StringComparison.InvariantCultureIgnoreCase)) diff --git a/src/BizHawk.Common/HawkFile/IHawkArchiveFile.cs b/src/BizHawk.Common/HawkFile/IHawkArchiveFile.cs index 3b2f910c98..ff3f9663b8 100644 --- a/src/BizHawk.Common/HawkFile/IHawkArchiveFile.cs +++ b/src/BizHawk.Common/HawkFile/IHawkArchiveFile.cs @@ -9,6 +9,7 @@ namespace BizHawk.Common { void ExtractFile(int index, Stream stream); - List Scan(); + /// on failure + List? Scan(); } }