From 7c61b9c43c28be9875eb2219a7e0f935f1ce5040 Mon Sep 17 00:00:00 2001 From: Next Turn <45985406+NextTurn@users.noreply.github.com> Date: Thu, 3 Sep 2020 21:44:20 +0800 Subject: [PATCH] Fix service crashes (#680) --- src/WinSW.Core/Util/ProcessHelper.cs | 15 ++++++++++++++- src/WinSW.Core/Util/SignalHelper.cs | 5 +++-- src/WinSW/WrapperService.cs | 3 +++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/WinSW.Core/Util/ProcessHelper.cs b/src/WinSW.Core/Util/ProcessHelper.cs index 28fbb37..47cbc53 100644 --- a/src/WinSW.Core/Util/ProcessHelper.cs +++ b/src/WinSW.Core/Util/ProcessHelper.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using System.Management; using System.Threading; using log4net; +using WinSW.Native; namespace WinSW.Util { @@ -168,7 +169,19 @@ namespace WinSW.Util } } - processToStart.Start(); + bool succeeded = ConsoleApis.SetConsoleCtrlHandler(null, false); // inherited + Debug.Assert(succeeded); + + try + { + processToStart.Start(); + } + finally + { + succeeded = ConsoleApis.SetConsoleCtrlHandler(null, true); + Debug.Assert(succeeded); + } + Logger.Info("Started process " + processToStart.Id); if (priority != null) diff --git a/src/WinSW.Core/Util/SignalHelper.cs b/src/WinSW.Core/Util/SignalHelper.cs index 7be1bfb..66a3350 100644 --- a/src/WinSW.Core/Util/SignalHelper.cs +++ b/src/WinSW.Core/Util/SignalHelper.cs @@ -29,9 +29,10 @@ namespace WinSW.Util return new KeyValuePair(false, error == Errors.ERROR_INVALID_PARAMETER); } - _ = ConsoleApis.SetConsoleCtrlHandler(null, true); + // Don't call GenerateConsoleCtrlEvent immediately after SetConsoleCtrlHandler. + // A delay was observed as of Windows 10, version 2004 and Windows Server 2019. _ = ConsoleApis.GenerateConsoleCtrlEvent(ConsoleApis.CtrlEvents.CTRL_C_EVENT, 0); - _ = ConsoleApis.SetConsoleCtrlHandler(null, false); + bool succeeded = ConsoleApis.FreeConsole(); Debug.Assert(succeeded); diff --git a/src/WinSW/WrapperService.cs b/src/WinSW/WrapperService.cs index 04ba60d..6641e20 100644 --- a/src/WinSW/WrapperService.cs +++ b/src/WinSW/WrapperService.cs @@ -182,6 +182,9 @@ namespace WinSW protected override void OnStart(string[] args) { + bool succeeded = ConsoleApis.SetConsoleCtrlHandler(null, true); + Debug.Assert(succeeded); + this.envs = this.descriptor.EnvironmentVariables; // TODO: Disabled according to security concerns in https://github.com/kohsuke/winsw/issues/54