Forráskód Böngészése

Bug 1982: Automatically resume transfer when TLS re-key fails

https://winscp.net/tracker/1982
(cherry picked from commit 64a802c4fa8dbf709f39293083eb93d4be636a60)

Source commit: d1ffdbb01832674697cfec09a946c41ec0633def
Martin Prikryl 4 éve
szülő
commit
3e3284eae4

+ 2 - 0
source/filezilla/FtpControlSocket.cpp

@@ -5747,6 +5747,8 @@ int CFtpControlSocket::OnLayerCallback(std::list<t_callbackMsg>& callbacks)
           switch (iter->nParam2)
           {
           case SSL_FAILURE_UNKNOWN:
+            // CTransferSocket has a special treatment of SSL_FAILURE_UNKNOWN,
+            // as an indication of a re-key failure.
             ShowStatus(IDS_ERRORMSG_UNKNOWNSSLERROR, FZ_LOG_ERROR);
             break;
           case SSL_FAILURE_ESTABLISH:

+ 16 - 8
source/filezilla/TransferSocket.cpp

@@ -1016,16 +1016,24 @@ int CTransferSocket::OnLayerCallback(std::list<t_callbackMsg>& callbacks)
           }
           break;
         case SSL_FAILURE:
-          switch (iter->nParam2)
           {
-          case SSL_FAILURE_ESTABLISH:
-            m_pOwner->ShowStatus(IDS_ERRORMSG_CANTESTABLISHSSLCONNECTION, FZ_LOG_ERROR);
-            break;
-          case SSL_FAILURE_INITSSL:
-            m_pOwner->ShowStatus(IDS_ERRORMSG_CANTINITSSL, FZ_LOG_ERROR);
-            break;
+            int Mode = CSMODE_TRANSFERERROR;
+            switch (iter->nParam2)
+            {
+            case SSL_FAILURE_UNKNOWN:
+              m_pOwner->ShowStatus(IDS_ERRORMSG_UNKNOWNSSLERROR, FZ_LOG_ERROR);
+              // This may indicate re-key failure, make sure we retry
+              Mode |= CSMODE_TRANSFERTIMEOUT;
+              break;
+            case SSL_FAILURE_ESTABLISH:
+              m_pOwner->ShowStatus(IDS_ERRORMSG_CANTESTABLISHSSLCONNECTION, FZ_LOG_ERROR);
+              break;
+            case SSL_FAILURE_INITSSL:
+              m_pOwner->ShowStatus(IDS_ERRORMSG_CANTINITSSL, FZ_LOG_ERROR);
+              break;
+            }
+            CloseAndEnsureSendClose(Mode);
           }
-          EnsureSendClose(CSMODE_TRANSFERERROR);
           break;
         case SSL_VERIFY_CERT:
           t_SslCertData data;