Skip to content

Commit e779d5d

Browse files
PaulHiginlzybkr
authored andcommitted
Fix for issue 1528: SSH based remoting does not handle errors during connection attempt (PowerShell#1856)
1 parent 3913d8b commit e779d5d

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

src/System.Management.Automation/engine/remoting/fanin/OutOfProcTransportManager.cs

+46-1
Original file line numberDiff line numberDiff line change
@@ -1466,6 +1466,9 @@ internal override void CreateAsync()
14661466
CloseConnection();
14671467
};
14681468

1469+
// Start error reader thread.
1470+
StartErrorThread(_stdErrReader);
1471+
14691472
// Create writer for named pipe.
14701473
stdInWriter = new OutOfProcessTextWriter(_stdInWriter);
14711474

@@ -1502,6 +1505,48 @@ private void CloseConnection()
15021505
}
15031506
}
15041507

1508+
private void StartErrorThread(
1509+
StreamReader stdErrReader)
1510+
{
1511+
Thread errorThread = new Thread(ProcessErrorThread);
1512+
errorThread.Name = "SSH Transport Error Thread";
1513+
errorThread.IsBackground = true;
1514+
errorThread.Start(stdErrReader);
1515+
}
1516+
1517+
private void ProcessErrorThread(object state)
1518+
{
1519+
try
1520+
{
1521+
StreamReader reader = state as StreamReader;
1522+
Dbg.Assert(reader != null, "Reader cannot be null.");
1523+
1524+
while (true)
1525+
{
1526+
string error = reader.ReadLine();
1527+
if (!string.IsNullOrEmpty(error) && (error.IndexOf("WARNING:", StringComparison.OrdinalIgnoreCase) < 0))
1528+
{
1529+
// Any SSH client error results in a broken session.
1530+
PSRemotingTransportException psrte = new PSRemotingTransportException(
1531+
PSRemotingErrorId.IPCServerProcessReportedError,
1532+
RemotingErrorIdStrings.IPCServerProcessReportedError,
1533+
error);
1534+
RaiseErrorHandler(new TransportErrorOccuredEventArgs(psrte, TransportMethodEnum.CloseShellOperationEx));
1535+
CloseConnection();
1536+
}
1537+
}
1538+
}
1539+
catch (ObjectDisposedException) { }
1540+
catch (Exception e)
1541+
{
1542+
CommandProcessorBase.CheckForSevereException(e);
1543+
1544+
string errorMsg = (e.Message != null) ? e.Message : string.Empty;
1545+
_tracer.WriteMessage("SSHClientSessionTransportManager", "ProcessErrorThread", Guid.Empty,
1546+
"Transport manager error thread ended with error: {0}", errorMsg);
1547+
}
1548+
}
1549+
15051550
private void StartReaderThread(
15061551
StreamReader reader)
15071552
{
@@ -1564,7 +1609,7 @@ private void ProcessReaderThread(object state)
15641609
}
15651610

15661611
string errorMsg = (e.Message != null) ? e.Message : string.Empty;
1567-
_tracer.WriteMessage("SSHClientSessionTransportManager", "StartReaderThread", Guid.Empty,
1612+
_tracer.WriteMessage("SSHClientSessionTransportManager", "ProcessReaderThread", Guid.Empty,
15681613
"Transport manager reader thread ended with error: {0}", errorMsg);
15691614
}
15701615
}

0 commit comments

Comments
 (0)