From 071990ccaf6a865287b62a387ed729a6c261a50f Mon Sep 17 00:00:00 2001 From: "phajdan.jr@chromium.org" Date: Mon, 2 Nov 2009 08:25:50 +0000 Subject: Correctly handle FTP servers which unexpectedly close the control connection. TEST=Covered by net_unittests. BUG=25023 Review URL: http://codereview.chromium.org/340054 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30693 0039d316-1c4b-4281-b951-d872f2087c98 --- net/ftp/ftp_network_transaction.cc | 8 ++++++++ net/ftp/ftp_network_transaction_unittest.cc | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) (limited to 'net/ftp') diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc index 03a1291..a4d0a73 100644 --- a/net/ftp/ftp_network_transaction.cc +++ b/net/ftp/ftp_network_transaction.cc @@ -522,6 +522,14 @@ int FtpNetworkTransaction::DoCtrlRead() { } int FtpNetworkTransaction::DoCtrlReadComplete(int result) { + if (result == 0) { + // Some servers (for example Pure-FTPd) apparently close the control + // connection when anonymous login is not permitted. For more details + // see http://crbug.com/25023. + if (command_sent_ == COMMAND_USER && username_ == L"anonymous") + response_.needs_auth = true; + return Stop(ERR_EMPTY_RESPONSE); + } if (result < 0) return Stop(result); diff --git a/net/ftp/ftp_network_transaction_unittest.cc b/net/ftp/ftp_network_transaction_unittest.cc index af86b13..169e788 100644 --- a/net/ftp/ftp_network_transaction_unittest.cc +++ b/net/ftp/ftp_network_transaction_unittest.cc @@ -502,6 +502,27 @@ class FtpMockControlSocketEvilLogin : public FtpMockControlSocketFileDownload { DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketEvilLogin); }; +class FtpMockControlSocketCloseConnection : public FtpMockControlSocket { + public: + FtpMockControlSocketCloseConnection() { + } + + virtual MockWriteResult OnWrite(const std::string& data) { + if (InjectFault()) + return MockWriteResult(true, data.length()); + switch (state()) { + case PRE_USER: + return Verify("USER anonymous\r\n", data, + PRE_QUIT, ""); + default: + return FtpMockControlSocket::OnWrite(data); + } + } + + private: + DISALLOW_COPY_AND_ASSIGN(FtpMockControlSocketCloseConnection); +}; + class FtpNetworkTransactionTest : public PlatformTest { public: FtpNetworkTransactionTest() @@ -849,6 +870,12 @@ TEST_F(FtpNetworkTransactionTest, Escaping) { OK); } +// Regression test for http://crbug.com/25023. +TEST_F(FtpNetworkTransactionTest, CloseConnection) { + FtpMockControlSocketCloseConnection ctrl_socket; + ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); +} + TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { FtpMockControlSocketDirectoryListing ctrl_socket; TransactionFailHelper(&ctrl_socket, -- cgit v1.1