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); } }