Explorar o código

Avoid sending data on a socket that is closed (by ourselves).

Gert Driesen %!s(int64=11) %!d(string=hai) anos
pai
achega
8b05e92d41
Modificáronse 1 ficheiros con 21 adicións e 7 borrados
  1. 21 7
      Renci.SshClient/Renci.SshNet/Channels/ChannelDirectTcpip.cs

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

@@ -13,7 +13,7 @@ namespace Renci.SshNet.Channels
     /// </summary>
     internal partial class ChannelDirectTcpip : ClientChannel, IChannelDirectTcpip
     {
-        private readonly object _socketShutdownAndCloseLock = new object();
+        private readonly object _socketLock = new object();
 
         private EventWaitHandle _channelOpen = new AutoResetEvent(false);
         private EventWaitHandle _channelData = new AutoResetEvent(false);
@@ -143,7 +143,7 @@ namespace Renci.SshNet.Channels
             if (_socket == null)
                 return;
 
-            lock (_socketShutdownAndCloseLock)
+            lock (_socketLock)
             {
                 if (_socket == null)
                     return;
@@ -161,10 +161,10 @@ namespace Renci.SshNet.Channels
         /// <param name="how">One of the <see cref="SocketShutdown"/> values that specifies the operation that will no longer be allowed.</param>
         private void ShutdownSocket(SocketShutdown how)
         {
-            if (_socket == null || !_socket.Connected)
+            if (_socket == null)
                 return;
 
-            lock (_socketShutdownAndCloseLock)
+            lock (_socketLock)
             {
                 if (_socket == null || !_socket.Connected)
                     return;
@@ -208,7 +208,15 @@ namespace Renci.SshNet.Channels
             base.OnData(data);
 
             if (_socket != null && _socket.Connected)
-                InternalSocketSend(data);
+            {
+                lock (_socketLock)
+                {
+                    if (_socket != null && _socket.Connected)
+                    {
+                        InternalSocketSend(data);
+                    }
+                }
+            }
         }
 
         /// <summary>
@@ -296,8 +304,14 @@ namespace Renci.SshNet.Channels
             {
                 if (_socket != null)
                 {
-                    _socket.Dispose();
-                    _socket = null;
+                    lock (_socketLock)
+                    {
+                        if (_socket != null)
+                        {
+                            _socket.Dispose();
+                            _socket = null;
+                        }
+                    }
                 }
 
                 if (_channelOpen != null)