浏览代码

Apply patches 14800 and 14801

olegkap_cp 12 年之前
父节点
当前提交
4d2b723bcd

+ 14 - 7
Renci.SshClient/Renci.SshNet/Channels/ChannelDirectTcpip.cs

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

+ 28 - 15
Renci.SshClient/Renci.SshNet/ForwardedPortLocal.NET.cs

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