Browse Source

Avoid race conditions signaling events.
Update release notes with new fixes.

Gert Driesen 11 years ago
parent
commit
cb7d2b6bd1
2 changed files with 104 additions and 133 deletions
  1. 4 2
      Renci.SshClient/Build/nuget/SSH.NET.nuspec
  2. 100 131
      Renci.SshClient/Renci.SshNet/Session.cs

+ 4 - 2
Renci.SshClient/Build/nuget/SSH.NET.nuspec

@@ -17,12 +17,14 @@
 
 Breaking changes:
 
-    * Assembly is now named Renci.SshNet for all supported frameworks
+    * Assembly name is now Renci.SshNet for all supported frameworks
     * The Renci.SshNet assemblies for .NET and Silverlight are now strong-named (issue #1802)
 
 Fixes:
 
-	* Connection dropped by server due to invalid DSA signature (issue #1918)
+    * Unobserved exception rethrown by finalizer thread (issue #1298)
+    * Client cipher is used to decrypt server messages (issue #1917)
+    * Connection dropped by server due to invalid DSA signature (issue #1918)
     * Correct casing of Security/Cryptography/HMAC.cs to fix build on Linux (issue #1505)
     * HTTP proxy hangs (issue #1890)
     * Wrong parameters to SetSocketOption leads to SocketException under Mono (issue #1799)

+ 100 - 131
Renci.SshClient/Renci.SshNet/Session.cs

@@ -190,7 +190,7 @@ namespace Renci.SshNet
         ///         <description>The SSH_MSG_DISCONNECT message - which is used to disconnect from the server - has been sent.</description>
         ///     </item>
         ///     <item>
-        ///         <description>The user has not been authenticated successfully.</description>
+        ///         <description>The client has not been authenticated successfully.</description>
         ///     </item>
         ///     <item>
         ///         <description>The listener thread - which is used to receive messages from the server - has stopped.</description>
@@ -216,9 +216,11 @@ namespace Renci.SshNet
         }
 
         /// <summary>
-        /// Gets or sets the session id.
+        /// Gets the session id.
         /// </summary>
-        /// <value>The session id.</value>
+        /// <value>
+        /// The session id, or <c>null</c> if the client has not been authenticated.
+        /// </value>
         public byte[] SessionId { get; private set; }
 
         private Message _clientInitMessage;
@@ -1141,15 +1143,13 @@ namespace Renci.SshNet
         {
             this.Log(string.Format("Disconnect received: {0} {1}", message.ReasonCode, message.Description));
 
-            if (this.DisconnectReceived != null)
-            {
-                this.DisconnectReceived(this, new MessageEventArgs<DisconnectMessage>(message));
-            }
+            var disconnectReceived = DisconnectReceived;
+            if (disconnectReceived != null)
+                disconnectReceived(this, new MessageEventArgs<DisconnectMessage>(message));
 
-            if (this.Disconnected != null)
-            {
-                this.Disconnected(this, new EventArgs());
-            }
+            var disconnected = Disconnected;
+            if (disconnected != null)
+                disconnected(this, new EventArgs());
         }
 
         /// <summary>
@@ -1158,10 +1158,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="IgnoreMessage"/> message.</param>
         protected virtual void OnIgnoreReceived(IgnoreMessage message)
         {
-            if (this.IgnoreReceived != null)
-            {
-                this.IgnoreReceived(this, new MessageEventArgs<IgnoreMessage>(message));
-            }
+            var handlers = IgnoreReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<IgnoreMessage>(message));
         }
 
         /// <summary>
@@ -1170,10 +1169,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="UnimplementedMessage"/> message.</param>
         protected virtual void OnUnimplementedReceived(UnimplementedMessage message)
         {
-            if (this.UnimplementedReceived != null)
-            {
-                this.UnimplementedReceived(this, new MessageEventArgs<UnimplementedMessage>(message));
-            }
+            var handlers = UnimplementedReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<UnimplementedMessage>(message));
         }
 
         /// <summary>
@@ -1182,10 +1180,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="DebugMessage"/> message.</param>
         protected virtual void OnDebugReceived(DebugMessage message)
         {
-            if (this.DebugReceived != null)
-            {
-                this.DebugReceived(this, new MessageEventArgs<DebugMessage>(message));
-            }
+            var handlers = DebugReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<DebugMessage>(message));
         }
 
         /// <summary>
@@ -1194,10 +1191,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ServiceRequestMessage"/> message.</param>
         protected virtual void OnServiceRequestReceived(ServiceRequestMessage message)
         {
-            if (this.ServiceRequestReceived != null)
-            {
-                this.ServiceRequestReceived(this, new MessageEventArgs<ServiceRequestMessage>(message));
-            }
+            var handlers = ServiceRequestReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ServiceRequestMessage>(message));
         }
 
         /// <summary>
@@ -1206,10 +1202,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ServiceAcceptMessage"/> message.</param>
         protected virtual void OnServiceAcceptReceived(ServiceAcceptMessage message)
         {
-            if (this.ServiceAcceptReceived != null)
-            {
-                this.ServiceAcceptReceived(this, new MessageEventArgs<ServiceAcceptMessage>(message));
-            }
+            var handlers = ServiceAcceptReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ServiceAcceptMessage>(message));
         }
 
         /// <summary>
@@ -1249,10 +1244,9 @@ namespace Renci.SshNet
             //  Start the algorithm implementation
             this._keyExchange.Start(this, message);
 
-            if (this.KeyExchangeInitReceived != null)
-            {
-                this.KeyExchangeInitReceived(this, new MessageEventArgs<KeyExchangeInitMessage>(message));
-            }
+            var keyExchangeInitReceived = KeyExchangeInitReceived;
+            if (keyExchangeInitReceived != null)
+                keyExchangeInitReceived(this, new MessageEventArgs<KeyExchangeInitMessage>(message));
         }
 
         /// <summary>
@@ -1303,10 +1297,9 @@ namespace Renci.SshNet
                     messageMetadata.Enabled = true;
             }
 
-            if (this.NewKeysReceived != null)
-            {
-                this.NewKeysReceived(this, new MessageEventArgs<NewKeysMessage>(message));
-            }
+            var newKeysReceived = NewKeysReceived;
+            if (newKeysReceived != null)
+                newKeysReceived(this, new MessageEventArgs<NewKeysMessage>(message));
 
             //  Signal that key exchange completed
             this._keyExchangeCompletedWaitHandle.Set();
@@ -1328,10 +1321,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="RequestMessage"/> message.</param>
         protected virtual void OnUserAuthenticationRequestReceived(RequestMessage message)
         {
-            if (this.UserAuthenticationRequestReceived != null)
-            {
-                this.UserAuthenticationRequestReceived(this, new MessageEventArgs<RequestMessage>(message));
-            }
+            var handlers = UserAuthenticationRequestReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<RequestMessage>(message));
         }
 
         /// <summary>
@@ -1340,10 +1332,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="FailureMessage"/> message.</param>
         protected virtual void OnUserAuthenticationFailureReceived(FailureMessage message)
         {
-            if (this.UserAuthenticationFailureReceived != null)
-            {
-                this.UserAuthenticationFailureReceived(this, new MessageEventArgs<FailureMessage>(message));
-            }
+            var handlers = UserAuthenticationFailureReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<FailureMessage>(message));
         }
 
         /// <summary>
@@ -1352,10 +1343,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="SuccessMessage"/> message.</param>
         protected virtual void OnUserAuthenticationSuccessReceived(SuccessMessage message)
         {
-            if (this.UserAuthenticationSuccessReceived != null)
-            {
-                this.UserAuthenticationSuccessReceived(this, new MessageEventArgs<SuccessMessage>(message));
-            }
+            var handlers = UserAuthenticationSuccessReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<SuccessMessage>(message));
         }
 
         /// <summary>
@@ -1364,10 +1354,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="BannerMessage"/> message.</param>
         protected virtual void OnUserAuthenticationBannerReceived(BannerMessage message)
         {
-            if (this.UserAuthenticationBannerReceived != null)
-            {
-                this.UserAuthenticationBannerReceived(this, new MessageEventArgs<BannerMessage>(message));
-            }
+            var handlers = UserAuthenticationBannerReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<BannerMessage>(message));
         }
 
         /// <summary>
@@ -1376,10 +1365,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="GlobalRequestMessage"/> message.</param>
         protected virtual void OnGlobalRequestReceived(GlobalRequestMessage message)
         {
-            if (this.GlobalRequestReceived != null)
-            {
-                this.GlobalRequestReceived(this, new MessageEventArgs<GlobalRequestMessage>(message));
-            }
+            var handlers = GlobalRequestReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<GlobalRequestMessage>(message));
         }
 
         /// <summary>
@@ -1388,10 +1376,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="RequestSuccessMessage"/> message.</param>
         protected virtual void OnRequestSuccessReceived(RequestSuccessMessage message)
         {
-            if (this.RequestSuccessReceived != null)
-            {
-                this.RequestSuccessReceived(this, new MessageEventArgs<RequestSuccessMessage>(message));
-            }
+            var handlers = RequestSuccessReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<RequestSuccessMessage>(message));
         }
 
         /// <summary>
@@ -1400,10 +1387,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="RequestFailureMessage"/> message.</param>
         protected virtual void OnRequestFailureReceived(RequestFailureMessage message)
         {
-            if (this.RequestFailureReceived != null)
-            {
-                this.RequestFailureReceived(this, new MessageEventArgs<RequestFailureMessage>(message));
-            }
+            var handlers = RequestFailureReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<RequestFailureMessage>(message));
         }
 
         /// <summary>
@@ -1412,10 +1398,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelOpenMessage"/> message.</param>
         protected virtual void OnChannelOpenReceived(ChannelOpenMessage message)
         {
-            if (this.ChannelOpenReceived != null)
-            {
-                this.ChannelOpenReceived(this, new MessageEventArgs<ChannelOpenMessage>(message));
-            }
+            var handlers = ChannelOpenReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelOpenMessage>(message));
         }
 
         /// <summary>
@@ -1424,10 +1409,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelOpenConfirmationMessage"/> message.</param>
         protected virtual void OnChannelOpenConfirmationReceived(ChannelOpenConfirmationMessage message)
         {
-            if (this.ChannelOpenConfirmationReceived != null)
-            {
-                this.ChannelOpenConfirmationReceived(this, new MessageEventArgs<ChannelOpenConfirmationMessage>(message));
-            }
+            var handlers = ChannelOpenConfirmationReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelOpenConfirmationMessage>(message));
         }
 
         /// <summary>
@@ -1436,10 +1420,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelOpenFailureMessage"/> message.</param>
         protected virtual void OnChannelOpenFailureReceived(ChannelOpenFailureMessage message)
         {
-            if (this.ChannelOpenFailureReceived != null)
-            {
-                this.ChannelOpenFailureReceived(this, new MessageEventArgs<ChannelOpenFailureMessage>(message));
-            }
+            var handlers = ChannelOpenFailureReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelOpenFailureMessage>(message));
         }
 
         /// <summary>
@@ -1448,10 +1431,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelWindowAdjustMessage"/> message.</param>
         protected virtual void OnChannelWindowAdjustReceived(ChannelWindowAdjustMessage message)
         {
-            if (this.ChannelWindowAdjustReceived != null)
-            {
-                this.ChannelWindowAdjustReceived(this, new MessageEventArgs<ChannelWindowAdjustMessage>(message));
-            }
+            var handlers = ChannelWindowAdjustReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelWindowAdjustMessage>(message));
         }
 
         /// <summary>
@@ -1460,10 +1442,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelDataMessage"/> message.</param>
         protected virtual void OnChannelDataReceived(ChannelDataMessage message)
         {
-            if (this.ChannelDataReceived != null)
-            {
-                this.ChannelDataReceived(this, new MessageEventArgs<ChannelDataMessage>(message));
-            }
+            var handlers = ChannelDataReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelDataMessage>(message));
         }
 
         /// <summary>
@@ -1472,10 +1453,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelExtendedDataMessage"/> message.</param>
         protected virtual void OnChannelExtendedDataReceived(ChannelExtendedDataMessage message)
         {
-            if (this.ChannelExtendedDataReceived != null)
-            {
-                this.ChannelExtendedDataReceived(this, new MessageEventArgs<ChannelExtendedDataMessage>(message));
-            }
+            var handlers = ChannelExtendedDataReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelExtendedDataMessage>(message));
         }
 
         /// <summary>
@@ -1484,10 +1464,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelCloseMessage"/> message.</param>
         protected virtual void OnChannelEofReceived(ChannelEofMessage message)
         {
-            if (this.ChannelEofReceived != null)
-            {
-                this.ChannelEofReceived(this, new MessageEventArgs<ChannelEofMessage>(message));
-            }
+            var handlers = ChannelEofReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelEofMessage>(message));
         }
 
         /// <summary>
@@ -1496,10 +1475,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelCloseMessage"/> message.</param>
         protected virtual void OnChannelCloseReceived(ChannelCloseMessage message)
         {
-            if (this.ChannelCloseReceived != null)
-            {
-                this.ChannelCloseReceived(this, new MessageEventArgs<ChannelCloseMessage>(message));
-            }
+            var handlers = ChannelCloseReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelCloseMessage>(message));
         }
 
         /// <summary>
@@ -1508,10 +1486,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelRequestMessage"/> message.</param>
         protected virtual void OnChannelRequestReceived(ChannelRequestMessage message)
         {
-            if (this.ChannelRequestReceived != null)
-            {
-                this.ChannelRequestReceived(this, new MessageEventArgs<ChannelRequestMessage>(message));
-            }
+            var handlers = ChannelRequestReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelRequestMessage>(message));
         }
 
         /// <summary>
@@ -1520,10 +1497,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelSuccessMessage"/> message.</param>
         protected virtual void OnChannelSuccessReceived(ChannelSuccessMessage message)
         {
-            if (this.ChannelSuccessReceived != null)
-            {
-                this.ChannelSuccessReceived(this, new MessageEventArgs<ChannelSuccessMessage>(message));
-            }
+            var handlers = ChannelSuccessReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelSuccessMessage>(message));
         }
 
         /// <summary>
@@ -1532,10 +1508,9 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="ChannelFailureMessage"/> message.</param>
         protected virtual void OnChannelFailureReceived(ChannelFailureMessage message)
         {
-            if (this.ChannelFailureReceived != null)
-            {
-                this.ChannelFailureReceived(this, new MessageEventArgs<ChannelFailureMessage>(message));
-            }
+            var handlers = ChannelFailureReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<ChannelFailureMessage>(message));
         }
 
         /// <summary>
@@ -1544,21 +1519,18 @@ namespace Renci.SshNet
         /// <param name="message"><see cref="Message"/> message.</param>
         protected virtual void OnMessageReceived(Message message)
         {
-            if (this.MessageReceived != null)
-            {
-                this.MessageReceived(this, new MessageEventArgs<Message>(message));
-            }
+            var handlers = MessageReceived;
+            if (handlers != null)
+                handlers(this, new MessageEventArgs<Message>(message));
         }
 
         #endregion
 
         private void KeyExchange_HostKeyReceived(object sender, HostKeyEventArgs e)
         {
-            var handler = this.HostKeyReceived;
-            if (handler != null)
-            {
-                handler(this, e);
-            }
+            var handlers = HostKeyReceived;
+            if (handlers != null)
+                handlers(this, e);
         }
 
         /// <summary>
@@ -1650,6 +1622,9 @@ namespace Renci.SshNet
         /// <param name="data">The data.</param>
         partial void SocketWrite(byte[] data);
 
+        /// <summary>
+        /// Disconnects and disposes the socket.
+        /// </summary>
         private void SocketDisconnectAndDispose()
         {
             if (_socket != null)
@@ -1664,7 +1639,6 @@ namespace Renci.SshNet
                     }
                 }
             }
-
         }
 
         /// <summary>
@@ -2007,7 +1981,9 @@ namespace Renci.SshNet
 
             this._exceptionWaitHandle.Set();
 
-            SignalErrorOccurred(exp);
+            var errorOccured = ErrorOccured;
+            if (errorOccured != null)
+                errorOccured(this, new ExceptionEventArgs(exp));
 
             if (connectionException != null && connectionException.DisconnectReason != DisconnectReason.ConnectionLost)
             {
@@ -2025,6 +2001,8 @@ namespace Renci.SshNet
                 _exceptionWaitHandle.Reset();
             if (_keyExchangeCompletedWaitHandle != null)
                 _keyExchangeCompletedWaitHandle.Reset();
+            if (_messageListenerCompleted != null)
+                _messageListenerCompleted.Reset();
 
             SessionId = null;
             _isDisconnectMessageSent = false;
@@ -2034,15 +2012,6 @@ namespace Renci.SshNet
             _keyExchangeInProgress = false;
         }
 
-        private void SignalErrorOccurred(Exception error)
-        {
-            var errorOccurred = ErrorOccured;
-            if (errorOccurred != null)
-            {
-                errorOccurred(this, new ExceptionEventArgs(error));
-            }
-        }
-
         #region IDisposable Members
 
         private bool _disposed;