Apply patches 14800 and 14801

This commit is contained in:
olegkap_cp
2013-07-10 13:05:29 +00:00
parent 3af40a0f83
commit 4d2b723bcd
2 changed files with 42 additions and 22 deletions
@@ -180,18 +180,21 @@ namespace Renci.SshNet.Channels
/// <summary>
/// Called when channel has no more data to receive.
/// </summary>
protected override void OnEof()
{
base.OnEof();
protected override void OnEof() {
base.OnEof();
this._channelEof.Set();
EventWaitHandle channelEof = this._channelEof;
if (channelEof != null)
channelEof.Set();
}
protected override void OnClose()
{
base.OnClose();
this._channelEof.Set();
EventWaitHandle channelEof = this._channelEof;
if (channelEof != null)
channelEof.Set();
}
protected override void OnErrorOccured(Exception exp)
@@ -199,7 +202,9 @@ namespace Renci.SshNet.Channels
base.OnErrorOccured(exp);
// If error occured, no more data can be received
this._channelEof.Set();
EventWaitHandle channelEof = this._channelEof;
if (channelEof != null)
channelEof.Set();
}
protected override void OnDisconnected()
@@ -207,7 +212,9 @@ namespace Renci.SshNet.Channels
base.OnDisconnected();
// If disconnected, no more data can be received
this._channelEof.Set();
EventWaitHandle channelEof = this._channelEof;
if (channelEof != null)
channelEof.Set();
}
partial void ExecuteThread(Action action);
@@ -13,7 +13,7 @@ namespace Renci.SshNet
public partial class ForwardedPortLocal
{
private TcpListener _listener;
private object _listenerLocker = new object();
private readonly object _listenerLocker = new object();
partial void InternalStart()
{
@@ -22,12 +22,12 @@ namespace Renci.SshNet
return;
IPAddress addr = this.BoundHost.GetIPAddress();
var ep = new IPEndPoint(addr, (int)this.BoundPort);
var ep = new IPEndPoint(addr, (int)this.BoundPort);
this._listener = new TcpListener(ep);
this._listener.Start();
// Update bound port if original was passed as zero
this.BoundPort = (uint) ((IPEndPoint) _listener.LocalEndpoint).Port;
this.BoundPort = (uint)((IPEndPoint)_listener.LocalEndpoint).Port;
this.Session.ErrorOccured += Session_ErrorOccured;
this.Session.Disconnected += Session_Disconnected;
@@ -55,13 +55,14 @@ namespace Renci.SshNet
this.RaiseRequestReceived(originatorEndPoint.Address.ToString(), (uint)originatorEndPoint.Port);
var channel = this.Session.CreateChannel<ChannelDirectTcpip>();
using (var channel = this.Session.CreateChannel<ChannelDirectTcpip>())
{
channel.Open(this.Host, this.Port, socket);
channel.Open(this.Host, this.Port, socket);
channel.Bind();
channel.Bind();
channel.Close();
channel.Close();
}
}
catch (Exception exp)
{
@@ -96,11 +97,11 @@ namespace Renci.SshNet
if (!this.IsStarted)
return;
lock (this._listenerLocker)
{
this._listener.Stop();
this._listener = null;
}
this.Session.Disconnected -= Session_Disconnected;
this.Session.ErrorOccured -= Session_ErrorOccured;
this.StopListener();
this._listenerTaskCompleted.WaitOne(this.Session.ConnectionInfo.Timeout);
this._listenerTaskCompleted.Dispose();
this._listenerTaskCompleted = null;
@@ -108,14 +109,26 @@ namespace Renci.SshNet
this.IsStarted = false;
}
private void StopListener()
{
lock (this._listenerLocker)
{
if (this._listener != null)
{
this._listener.Stop();
this._listener = null;
}
}
}
private void Session_ErrorOccured(object sender, Common.ExceptionEventArgs e)
{
this._listener.Stop();
this.StopListener();
}
private void Session_Disconnected(object sender, EventArgs e)
{
this._listener.Stop();
this.StopListener();
}
}
}