浏览代码

Bug fix: After FTP data connection fails to open further use of the session is broken

Source commit: 8f36620525c1756e8e4593f5be689ed695580079
Martin Prikryl 1 周之前
父节点
当前提交
99b57046b3
共有 2 个文件被更改,包括 20 次插入3 次删除
  1. 19 3
      source/filezilla/FtpControlSocket.cpp
  2. 1 0
      source/filezilla/FtpControlSocket.h

+ 19 - 3
source/filezilla/FtpControlSocket.cpp

@@ -2279,6 +2279,7 @@ bool CFtpControlSocket::ConnectTransferSocket(const CString & host, UINT port)
   {
     if (GetLastError() != WSAEWOULDBLOCK)
     {
+      TransferSocketFailed();
       result = false;
     }
     else
@@ -2494,6 +2495,12 @@ void CFtpControlSocket::ListFile(CString filename, const CServerPath &path)
   }
 }
 
+void CFtpControlSocket::TransferSocketFailed()
+{
+  // if the control connection is to be used further, the response to LIST/RETR/STOR must be skipped
+  m_skipReply = true;
+}
+
 void CFtpControlSocket::TransferEnd(int nMode)
 {
   if (!m_Operation.nOpMode)
@@ -2502,10 +2509,19 @@ void CFtpControlSocket::TransferEnd(int nMode)
     return;
   }
   m_LastRecvTime=CTime::CreateForCurrentTime();
-  if (m_Operation.nOpMode&CSMODE_TRANSFER)
-    FileTransfer(0,TRUE,nMode&(CSMODE_TRANSFERERROR|CSMODE_TRANSFERTIMEOUT));
+  int error = nMode & (CSMODE_TRANSFERERROR | CSMODE_TRANSFERTIMEOUT);
+  if (error)
+  {
+    TransferSocketFailed();
+  }
+  if (m_Operation.nOpMode & CSMODE_TRANSFER)
+  {
+    FileTransfer(0, TRUE, error);
+  }
   else if (m_Operation.nOpMode&CSMODE_LIST)
-    List(TRUE,nMode&(CSMODE_TRANSFERERROR|CSMODE_TRANSFERTIMEOUT));
+  {
+    List(TRUE, error);
+  }
 }
 
 void CFtpControlSocket::OnClose(int nErrorCode)

+ 1 - 0
source/filezilla/FtpControlSocket.h

@@ -157,6 +157,7 @@ protected:
   BOOL Connect(CString hostAddress, UINT nHostPort);
   CString ConvertDomainName(CString domain);
   bool ConnectTransferSocket(const CString & host, UINT port);
+  void TransferSocketFailed();
 
   struct t_ActiveList
   {