diff --git a/RecursiveExtractor/Extractors/TarExtractor.cs b/RecursiveExtractor/Extractors/TarExtractor.cs index 4d5a2dc..0d7329d 100644 --- a/RecursiveExtractor/Extractors/TarExtractor.cs +++ b/RecursiveExtractor/Extractors/TarExtractor.cs @@ -62,6 +62,8 @@ public async IAsyncEnumerable ExtractAsync(FileEntry fileEntry, Extra catch (Exception e) { Logger.Debug(Extractor.FAILED_PARSING_ERROR_MESSAGE_STRING, ArchiveFileType.TAR, fileEntry.FullPath, tarEntry.Key, e.GetType()); + fs?.Dispose(); + continue; } var name = tarEntry.Key?.Replace('/', Path.DirectorySeparatorChar); if (string.IsNullOrEmpty(name)) @@ -135,6 +137,8 @@ public IEnumerable Extract(FileEntry fileEntry, ExtractorOptions opti catch (Exception e) { Logger.Debug(Extractor.FAILED_PARSING_ERROR_MESSAGE_STRING, ArchiveFileType.TAR, fileEntry.FullPath, tarEntry.Key, e.GetType()); + fs?.Dispose(); + continue; } var name = tarEntry.Key?.Replace('/', Path.DirectorySeparatorChar); if (string.IsNullOrEmpty(name)) diff --git a/RecursiveExtractor/Extractors/ZipExtractor.cs b/RecursiveExtractor/Extractors/ZipExtractor.cs index 92dfc04..49da757 100644 --- a/RecursiveExtractor/Extractors/ZipExtractor.cs +++ b/RecursiveExtractor/Extractors/ZipExtractor.cs @@ -141,11 +141,12 @@ public async IAsyncEnumerable ExtractAsync(FileEntry fileEntry, Extra catch (Exception e) { Logger.Debug(Extractor.FAILED_PARSING_ERROR_MESSAGE_STRING, ArchiveFileType.ZIP, fileEntry.FullPath, zipEntry.Key, e.GetType()); + target?.Dispose(); + continue; } - target ??= new MemoryStream(); var name = zipEntry.Key?.Replace('/', Path.DirectorySeparatorChar) ?? ""; - var newFileEntry = new FileEntry(name, target, fileEntry, modifyTime: zipEntry.LastModifiedTime, memoryStreamCutoff: options.MemoryStreamCutoff); + var newFileEntry = new FileEntry(name, target, fileEntry, modifyTime: zipEntry.LastModifiedTime, memoryStreamCutoff: options.MemoryStreamCutoff, passthroughStream: true); try { @@ -254,7 +255,7 @@ public IEnumerable Extract(FileEntry fileEntry, ExtractorOptions opti governor.CheckResourceGovernor(zipEntry.Size); - using var fs = StreamFactory.GenerateAppropriateBackingStream(options, zipEntry.Size); + var fs = StreamFactory.GenerateAppropriateBackingStream(options, zipEntry.Size); try { @@ -264,10 +265,12 @@ public IEnumerable Extract(FileEntry fileEntry, ExtractorOptions opti catch (Exception e) { Logger.Debug(Extractor.FAILED_PARSING_ERROR_MESSAGE_STRING, ArchiveFileType.ZIP, fileEntry.FullPath, zipEntry.Key, e.GetType()); + fs?.Dispose(); + continue; } var name = zipEntry.Key?.Replace('/', Path.DirectorySeparatorChar) ?? ""; - var newFileEntry = new FileEntry(name, fs, fileEntry, modifyTime: zipEntry.LastModifiedTime, memoryStreamCutoff: options.MemoryStreamCutoff); + var newFileEntry = new FileEntry(name, fs, fileEntry, passthroughStream: true, modifyTime: zipEntry.LastModifiedTime, memoryStreamCutoff: options.MemoryStreamCutoff); try {