From e779d5dda108a033675f2e04bd2ee984276983d0 Mon Sep 17 00:00:00 2001 From: Paul Higinbotham Date: Thu, 18 Aug 2016 16:08:58 -0700 Subject: [PATCH] Fix for issue 1528: SSH based remoting does not handle errors during connection attempt (#1856) --- .../fanin/OutOfProcTransportManager.cs | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs index cad472de9..c31231e42 100644 --- a/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs +++ b/src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs @@ -1466,6 +1466,9 @@ namespace System.Management.Automation.Remoting.Client CloseConnection(); }; + // Start error reader thread. + StartErrorThread(_stdErrReader); + // Create writer for named pipe. stdInWriter = new OutOfProcessTextWriter(_stdInWriter); @@ -1502,6 +1505,48 @@ namespace System.Management.Automation.Remoting.Client } } + private void StartErrorThread( + StreamReader stdErrReader) + { + Thread errorThread = new Thread(ProcessErrorThread); + errorThread.Name = "SSH Transport Error Thread"; + errorThread.IsBackground = true; + errorThread.Start(stdErrReader); + } + + private void ProcessErrorThread(object state) + { + try + { + StreamReader reader = state as StreamReader; + Dbg.Assert(reader != null, "Reader cannot be null."); + + while (true) + { + string error = reader.ReadLine(); + if (!string.IsNullOrEmpty(error) && (error.IndexOf("WARNING:", StringComparison.OrdinalIgnoreCase) < 0)) + { + // Any SSH client error results in a broken session. + PSRemotingTransportException psrte = new PSRemotingTransportException( + PSRemotingErrorId.IPCServerProcessReportedError, + RemotingErrorIdStrings.IPCServerProcessReportedError, + error); + RaiseErrorHandler(new TransportErrorOccuredEventArgs(psrte, TransportMethodEnum.CloseShellOperationEx)); + CloseConnection(); + } + } + } + catch (ObjectDisposedException) { } + catch (Exception e) + { + CommandProcessorBase.CheckForSevereException(e); + + string errorMsg = (e.Message != null) ? e.Message : string.Empty; + _tracer.WriteMessage("SSHClientSessionTransportManager", "ProcessErrorThread", Guid.Empty, + "Transport manager error thread ended with error: {0}", errorMsg); + } + } + private void StartReaderThread( StreamReader reader) { @@ -1564,7 +1609,7 @@ namespace System.Management.Automation.Remoting.Client } string errorMsg = (e.Message != null) ? e.Message : string.Empty; - _tracer.WriteMessage("SSHClientSessionTransportManager", "StartReaderThread", Guid.Empty, + _tracer.WriteMessage("SSHClientSessionTransportManager", "ProcessReaderThread", Guid.Empty, "Transport manager reader thread ended with error: {0}", errorMsg); } }