Переглянути джерело

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

https://winscp.net/tracker/1982

Source commit: 039f81403ff440a4a4135ce7164e76029519baa2
Martin Prikryl 4 роки тому
батько
коміт
64a802c4fa

+ 2 - 0
source/filezilla/FtpControlSocket.cpp

@@ -5752,6 +5752,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;