Fix for issue 1528: SSH based remoting does not handle errors during connection attempt (#1856)

This commit is contained in:
Paul Higinbotham 2016-08-18 16:08:58 -07:00 committed by Jason Shirk
parent 3913d8bea2
commit e779d5dda1

View file

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