From 2b19de1d9aa4f763fcb55e3c6db8019fa80dc90b Mon Sep 17 00:00:00 2001 From: Salvador Cipolla Date: Sat, 11 Apr 2026 17:49:49 -0300 Subject: [PATCH] fix race condition on 7z unpack and possible exception (M6 & M7 Fix) --- Knossos.NET/Classes/SevenZipConsoleWrapper.cs | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/Knossos.NET/Classes/SevenZipConsoleWrapper.cs b/Knossos.NET/Classes/SevenZipConsoleWrapper.cs index 7124da7d..8aa224d5 100644 --- a/Knossos.NET/Classes/SevenZipConsoleWrapper.cs +++ b/Knossos.NET/Classes/SevenZipConsoleWrapper.cs @@ -25,20 +25,28 @@ public class SevenZipConsoleWrapper : IDisposable private Process? process; private bool completedSuccessfully = false; private CancellationTokenSource? cancelSource; + private static readonly object _unpackLock = new object(); public SevenZipConsoleWrapper(Action? progressCallback = null, CancellationTokenSource? cancelSource = null) { - if(pathToConsoleExecutable == null) + if (pathToConsoleExecutable == null) { - pathToConsoleExecutable = UnpackExec(); - if (File.Exists(pathToConsoleExecutable)) + lock (_unpackLock) { - _ = Run(); - } - else - { - pathToConsoleExecutable = null; - Log.Add(Log.LogSeverity.Error, "SevenZipConsoleWrapper.Constructor", "File does not exist: " + pathToConsoleExecutable); + if (pathToConsoleExecutable == null) + { + pathToConsoleExecutable = UnpackExec(); + + if (File.Exists(pathToConsoleExecutable)) + { + _ = Run(); // get version + } + else + { + pathToConsoleExecutable = null; + Log.Add(Log.LogSeverity.Error, "SevenZipConsoleWrapper.Constructor", "File does not exist: " + pathToConsoleExecutable); + } + } } } this.progressCallback = progressCallback; @@ -174,7 +182,10 @@ public void KillProcess() { if (process != null && process.ExitCode != 0) { - process.Kill(); + if (!process.HasExited) + { + process.Kill(); + } } } catch (Exception ex) @@ -383,7 +394,7 @@ protected virtual void Dispose(bool disposing) { try { - if (process.ExitCode != 0) + if (!process.HasExited) { process.Kill(); }