Fix for issue 1528: SSH based remoting does not handle errors during connection attempt (#1856)
This commit is contained in:
parent
3913d8bea2
commit
e779d5dda1
|
@ -1466,6 +1466,9 @@ namespace System.Management.Automation.Remoting.Client
|
||||||
CloseConnection();
|
CloseConnection();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Start error reader thread.
|
||||||
|
StartErrorThread(_stdErrReader);
|
||||||
|
|
||||||
// Create writer for named pipe.
|
// Create writer for named pipe.
|
||||||
stdInWriter = new OutOfProcessTextWriter(_stdInWriter);
|
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(
|
private void StartReaderThread(
|
||||||
StreamReader reader)
|
StreamReader reader)
|
||||||
{
|
{
|
||||||
|
@ -1564,7 +1609,7 @@ namespace System.Management.Automation.Remoting.Client
|
||||||
}
|
}
|
||||||
|
|
||||||
string errorMsg = (e.Message != null) ? e.Message : string.Empty;
|
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);
|
"Transport manager reader thread ended with error: {0}", errorMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue