From 2695e0039c6d71e842bf3be9d23334b9487673c4 Mon Sep 17 00:00:00 2001 From: PaulHigin Date: Tue, 3 Oct 2017 11:07:12 -0700 Subject: [PATCH 1/2] Fix for Linux platform PowerShell exit on error during SSH remoting connection --- .../fanin/OutOfProcTransportManager.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs index 916ae466498..dd3e49b856b 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs @@ -1488,18 +1488,23 @@ private void CloseConnection() var stdErrReader = _stdErrReader; if (stdErrReader != null) { stdErrReader.Dispose(); } - try + var sshProcessId = _sshProcessId; + _sshProcessId = 0; + if (sshProcessId != 0) { - var sshProcess = System.Diagnostics.Process.GetProcessById(_sshProcessId); - if ((sshProcess != null) && !sshProcess.HasExited) + try { - sshProcess.Kill(); + var sshProcess = System.Diagnostics.Process.GetProcessById(sshProcessId); + if ((sshProcess != null) && (sshProcess.Handle != IntPtr.Zero) && !sshProcess.HasExited) + { + sshProcess.Kill(); + } } + catch (ArgumentException) { } + catch (InvalidOperationException) { } + catch (NotSupportedException) { } + catch (System.ComponentModel.Win32Exception) { } } - catch (ArgumentException) { } - catch (InvalidOperationException) { } - catch (NotSupportedException) { } - catch (System.ComponentModel.Win32Exception) { } } private void StartErrorThread( From 6ff7c85049687a55f87ed613221e9c424768bb8f Mon Sep 17 00:00:00 2001 From: PaulHigin Date: Tue, 3 Oct 2017 13:15:18 -0700 Subject: [PATCH 2/2] Added comment for clarification per code review request --- .../engine/remoting/fanin/OutOfProcTransportManager.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs index dd3e49b856b..e1d8d3a2a5e 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs @@ -1488,6 +1488,9 @@ private void CloseConnection() var stdErrReader = _stdErrReader; if (stdErrReader != null) { stdErrReader.Dispose(); } + // The CloseConnection() method can be called multiple times from multiple places. + // Set the _sshProcessId to zero here so that we go through the work of finding + // and terminating the SSH process just once. var sshProcessId = _sshProcessId; _sshProcessId = 0; if (sshProcessId != 0)