diff options
author | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-15 02:48:31 +0000 |
---|---|---|
committer | phajdan.jr@chromium.org <phajdan.jr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-11-15 02:48:31 +0000 |
commit | 3b821c6b842d80cad47557d8758e65fc0a43e2ad (patch) | |
tree | 69d1d6cc116dd967e6b1d6fe4f582c4af0f68b9d /net/ftp | |
parent | cf92ef7734f5039537706776ba19e7d58f6fc4b3 (diff) | |
download | chromium_src-3b821c6b842d80cad47557d8758e65fc0a43e2ad.zip chromium_src-3b821c6b842d80cad47557d8758e65fc0a43e2ad.tar.gz chromium_src-3b821c6b842d80cad47557d8758e65fc0a43e2ad.tar.bz2 |
FTP: Open a fresh data connection after a command error.
Apparently some FTP servers interpret RFC 959 in a way
that makes it possible for them to close the data connection
on a command error. We can't be sure whether that happened
or not, so just always open a new connection after receiving
an error message.
BUG=121335
TEST=Covered by net_unittests.
Review URL: https://chromiumcodereview.appspot.com/11364224
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167832 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/ftp')
-rw-r--r-- | net/ftp/ftp_network_transaction.cc | 40 | ||||
-rw-r--r-- | net/ftp/ftp_network_transaction.h | 6 | ||||
-rw-r--r-- | net/ftp/ftp_network_transaction_unittest.cc | 169 |
3 files changed, 141 insertions, 74 deletions
diff --git a/net/ftp/ftp_network_transaction.cc b/net/ftp/ftp_network_transaction.cc index 1b5bd92..272f49f 100644 --- a/net/ftp/ftp_network_transaction.cc +++ b/net/ftp/ftp_network_transaction.cc @@ -224,7 +224,8 @@ FtpNetworkTransaction::FtpNetworkTransaction( use_epsv_(true), data_connection_port_(0), socket_factory_(socket_factory), - next_state_(STATE_NONE) { + next_state_(STATE_NONE), + state_after_data_connect_complete_(STATE_CTRL_WRITE_SIZE) { } FtpNetworkTransaction::~FtpNetworkTransaction() { @@ -346,6 +347,21 @@ void FtpNetworkTransaction::ResetStateForRestart() { ctrl_socket_.reset(); data_socket_.reset(); next_state_ = STATE_NONE; + state_after_data_connect_complete_ = STATE_CTRL_WRITE_SIZE; +} + +void FtpNetworkTransaction::ResetDataConnectionAfterError(State next_state) { + // The server _might_ have reset the data connection + // (see RFC 959 3.2. ESTABLISHING DATA CONNECTIONS: + // "The server MUST close the data connection under the following + // conditions: + // ... + // 5. An irrecoverable error condition occurs.") + // + // It is ambiguous what an irrecoverable error condition is, + // so we take no chances. + state_after_data_connect_complete_ = next_state; + next_state_ = use_epsv_ ? STATE_CTRL_WRITE_EPSV : STATE_CTRL_WRITE_PASV; } void FtpNetworkTransaction::DoCallback(int rv) { @@ -1050,8 +1066,15 @@ int FtpNetworkTransaction::DoCtrlWriteSIZE() { int FtpNetworkTransaction::ProcessResponseSIZE( const FtpCtrlResponse& response) { + State state_after_size; + if (resource_type_ == RESOURCE_TYPE_FILE) + state_after_size = STATE_CTRL_WRITE_RETR; + else + state_after_size = STATE_CTRL_WRITE_CWD; + switch (GetErrorClass(response.status_code)) { case ERROR_CLASS_INITIATED: + next_state_ = state_after_size; break; case ERROR_CLASS_OK: if (response.lines.size() != 1) @@ -1066,10 +1089,14 @@ int FtpNetworkTransaction::ProcessResponseSIZE( // Some FTP servers (for example, the qnx one) send a SIZE even for // directories. response_.expected_content_size = size; + + next_state_ = state_after_size; break; case ERROR_CLASS_INFO_NEEDED: + next_state_ = state_after_size; break; case ERROR_CLASS_TRANSIENT_ERROR: + ResetDataConnectionAfterError(state_after_size); break; case ERROR_CLASS_PERMANENT_ERROR: // It's possible that SIZE failed because the path is a directory. @@ -1077,17 +1104,14 @@ int FtpNetworkTransaction::ProcessResponseSIZE( response.status_code != 550) { return Stop(GetNetErrorCodeForFtpResponseCode(response.status_code)); } + + ResetDataConnectionAfterError(state_after_size); break; default: NOTREACHED(); return Stop(ERR_UNEXPECTED); } - if (resource_type_ == RESOURCE_TYPE_FILE) - next_state_ = STATE_CTRL_WRITE_RETR; - else - next_state_ = STATE_CTRL_WRITE_CWD; - return OK; } @@ -1142,8 +1166,8 @@ int FtpNetworkTransaction::ProcessResponseCWDNotADirectory() { // type is. It could still be file, and SIZE could fail because of // an access error (http://crbug.com/56734). Try RETR just to be sure. resource_type_ = RESOURCE_TYPE_FILE; - next_state_ = STATE_CTRL_WRITE_RETR; + ResetDataConnectionAfterError(STATE_CTRL_WRITE_RETR); return OK; } @@ -1239,7 +1263,7 @@ int FtpNetworkTransaction::DoDataConnectComplete(int result) { if (result != OK) return Stop(result); - next_state_ = STATE_CTRL_WRITE_SIZE; + next_state_ = state_after_data_connect_complete_; return OK; } diff --git a/net/ftp/ftp_network_transaction.h b/net/ftp/ftp_network_transaction.h index d5a3b9c..e425c36 100644 --- a/net/ftp/ftp_network_transaction.h +++ b/net/ftp/ftp_network_transaction.h @@ -125,6 +125,9 @@ class NET_EXPORT_PRIVATE FtpNetworkTransaction : public FtpTransaction { // Resets the members of the transaction so it can be restarted. void ResetStateForRestart(); + // Resets the data connection after an error and switches to |next_state|. + void ResetDataConnectionAfterError(State next_state); + void DoCallback(int result); void OnIOComplete(int result); @@ -249,6 +252,9 @@ class NET_EXPORT_PRIVATE FtpNetworkTransaction : public FtpTransaction { scoped_ptr<StreamSocket> data_socket_; State next_state_; + + // State to switch to after data connection is complete. + State state_after_data_connect_complete_; }; } // namespace net diff --git a/net/ftp/ftp_network_transaction_unittest.cc b/net/ftp/ftp_network_transaction_unittest.cc index 05477b3..353e3e1 100644 --- a/net/ftp/ftp_network_transaction_unittest.cc +++ b/net/ftp/ftp_network_transaction_unittest.cc @@ -44,6 +44,10 @@ class FtpSocketDataProvider : public DynamicSocketDataProvider { PRE_PASV, PRE_LIST, PRE_RETR, + PRE_RETR_EPSV, + PRE_RETR_PASV, + PRE_CWD_EPSV, + PRE_CWD_PASV, PRE_CWD, PRE_QUIT, PRE_NOPASV, @@ -82,6 +86,18 @@ class FtpSocketDataProvider : public DynamicSocketDataProvider { case PRE_EPSV: return Verify("EPSV\r\n", data, PRE_SIZE, "227 Entering Extended Passive Mode (|||31744|)\r\n"); + case PRE_CWD_EPSV: + return Verify("EPSV\r\n", data, PRE_CWD, + "227 Entering Extended Passive Mode (|||31744|)\r\n"); + case PRE_RETR_EPSV: + return Verify("EPSV\r\n", data, PRE_RETR, + "227 Entering Extended Passive Mode (|||31744|)\r\n"); + case PRE_CWD_PASV: + return Verify("PASV\r\n", data, PRE_CWD, + "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); + case PRE_RETR_PASV: + return Verify("PASV\r\n", data, PRE_RETR, + "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); case PRE_NOPASV: // Use unallocated 599 FTP error code to make sure it falls into the // generic ERR_FTP_FAILED bucket. @@ -186,7 +202,7 @@ class FtpSocketDataProviderDirectoryListing : public FtpSocketDataProvider { return MockWriteResult(ASYNC, data.length()); switch (state()) { case PRE_SIZE: - return Verify("SIZE /\r\n", data, PRE_CWD, + return Verify("SIZE /\r\n", data, PRE_CWD_EPSV, "550 I can only retrieve regular files\r\n"); case PRE_CWD: return Verify("CWD /\r\n", data, PRE_LIST, "200 OK\r\n"); @@ -217,6 +233,9 @@ class FtpSocketDataProviderDirectoryListingWithPasvFallback case PRE_PASV: return Verify("PASV\r\n", data, PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); + case PRE_SIZE: + return Verify("SIZE /\r\n", data, PRE_CWD_PASV, + "550 I can only retrieve regular files\r\n"); default: return FtpSocketDataProviderDirectoryListing::OnWrite(data); } @@ -268,7 +287,7 @@ class FtpSocketDataProviderVMSDirectoryListing : public FtpSocketDataProvider { return Verify("PASV\r\n", data, PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); case PRE_SIZE: - return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD, + return Verify("SIZE ANONYMOUS_ROOT:[000000]dir\r\n", data, PRE_CWD_PASV, "550 I can only retrieve regular files\r\n"); case PRE_CWD: return Verify("CWD ANONYMOUS_ROOT:[dir]\r\n", data, PRE_LIST, @@ -306,7 +325,7 @@ class FtpSocketDataProviderVMSDirectoryListingRootDirectory return Verify("PASV\r\n", data, PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); case PRE_SIZE: - return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD, + return Verify("SIZE ANONYMOUS_ROOT\r\n", data, PRE_CWD_PASV, "550 I can only retrieve regular files\r\n"); case PRE_CWD: return Verify("CWD ANONYMOUS_ROOT:[000000]\r\n", data, PRE_LIST, @@ -360,7 +379,7 @@ class FtpSocketDataProviderFileDownload : public FtpSocketDataProvider { return Verify("SIZE /file\r\n", data, PRE_CWD, "213 18\r\n"); case PRE_CWD: - return Verify("CWD /file\r\n", data, PRE_RETR, + return Verify("CWD /file\r\n", data, PRE_RETR_EPSV, "550 Not a directory\r\n"); case PRE_RETR: return Verify("RETR /file\r\n", data, PRE_QUIT, "200 OK\r\n"); @@ -383,10 +402,10 @@ class FtpSocketDataProviderFileNotFound : public FtpSocketDataProvider { return MockWriteResult(ASYNC, data.length()); switch (state()) { case PRE_SIZE: - return Verify("SIZE /file\r\n", data, PRE_CWD, + return Verify("SIZE /file\r\n", data, PRE_CWD_EPSV, "550 File Not Found\r\n"); case PRE_CWD: - return Verify("CWD /file\r\n", data, PRE_RETR, + return Verify("CWD /file\r\n", data, PRE_RETR_EPSV, "550 File Not Found\r\n"); case PRE_RETR: return Verify("RETR /file\r\n", data, PRE_QUIT, @@ -416,6 +435,9 @@ class FtpSocketDataProviderFileDownloadWithPasvFallback case PRE_PASV: return Verify("PASV\r\n", data, PRE_SIZE, "227 Entering Passive Mode 127,0,0,1,123,456\r\n"); + case PRE_CWD: + return Verify("CWD /file\r\n", data, PRE_RETR_PASV, + "550 Not a directory\r\n"); default: return FtpSocketDataProviderFileDownload::OnWrite(data); } @@ -439,7 +461,7 @@ class FtpSocketDataProviderFileDownloadZeroSize return Verify("SIZE /file\r\n", data, PRE_CWD, "213 0\r\n"); case PRE_CWD: - return Verify("CWD /file\r\n", data, PRE_RETR, + return Verify("CWD /file\r\n", data, PRE_RETR_EPSV, "550 not a directory\r\n"); default: return FtpSocketDataProviderFileDownload::OnWrite(data); @@ -461,7 +483,7 @@ class FtpSocketDataProviderFileDownloadCWD451 return MockWriteResult(ASYNC, data.length()); switch (state()) { case PRE_CWD: - return Verify("CWD /file\r\n", data, PRE_RETR, + return Verify("CWD /file\r\n", data, PRE_RETR_EPSV, "451 not a directory\r\n"); default: return FtpSocketDataProviderFileDownload::OnWrite(data); @@ -496,7 +518,7 @@ class FtpSocketDataProviderVMSFileDownload : public FtpSocketDataProvider { return Verify("SIZE ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_CWD, "213 18\r\n"); case PRE_CWD: - return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR, + return Verify("CWD ANONYMOUS_ROOT:[file]\r\n", data, PRE_RETR_PASV, "550 Not a directory\r\n"); case PRE_RETR: return Verify("RETR ANONYMOUS_ROOT:[000000]file\r\n", data, PRE_QUIT, @@ -523,7 +545,7 @@ class FtpSocketDataProviderEscaping : public FtpSocketDataProviderFileDownload { return Verify("SIZE / !\"#$%y\200\201\r\n", data, PRE_CWD, "213 18\r\n"); case PRE_CWD: - return Verify("CWD / !\"#$%y\200\201\r\n", data, PRE_RETR, + return Verify("CWD / !\"#$%y\200\201\r\n", data, PRE_RETR_EPSV, "550 Not a directory\r\n"); case PRE_RETR: return Verify("RETR / !\"#$%y\200\201\r\n", data, PRE_QUIT, @@ -766,7 +788,10 @@ class FtpNetworkTransactionTest : public PlatformTest { void ExecuteTransaction(FtpSocketDataProvider* ctrl_socket, const char* request, + int data_socket, int expected_result) { + mock_socket_factory_.AddSocketDataProvider(ctrl_socket); + std::string mock_data("mock-data"); MockRead data_reads[] = { // Usually FTP servers close the data connection after the entire data has @@ -774,10 +799,20 @@ class FtpNetworkTransactionTest : public PlatformTest { MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), MockRead(mock_data.c_str()), }; - StaticSocketDataProvider data_socket(data_reads, arraysize(data_reads), - NULL, 0); - mock_socket_factory_.AddSocketDataProvider(ctrl_socket); - mock_socket_factory_.AddSocketDataProvider(&data_socket); + + scoped_array<StaticSocketDataProvider*> data_sockets( + new StaticSocketDataProvider*[data_socket + 1]); + for (int i = 0; i < data_socket + 1; i++) { + // We only read from one data socket, other ones are dummy. + if (i == data_socket) { + data_sockets[i] = new StaticSocketDataProvider( + data_reads, arraysize(data_reads), NULL, 0); + } else { + data_sockets[i] = new StaticSocketDataProvider; + } + mock_socket_factory_.AddSocketDataProvider(data_sockets[i]); + } + FtpRequestInfo request_info = GetRequestInfo(request); EXPECT_EQ(LOAD_STATE_IDLE, transaction_.GetLoadState()); ASSERT_EQ(ERR_IO_PENDING, @@ -815,7 +850,7 @@ class FtpNetworkTransactionTest : public PlatformTest { const char* response, int expected_result) { ctrl_socket->InjectFailure(state, next_state, response); - ExecuteTransaction(ctrl_socket, request, expected_result); + ExecuteTransaction(ctrl_socket, request, 1, expected_result); } scoped_ptr<MockHostResolver> host_resolver_; @@ -848,12 +883,12 @@ TEST_F(FtpNetworkTransactionTest, StripBracketsFromIPv6Literals) { FtpSocketDataProviderEvilSize ctrl_socket( "213 99999999999999999999999999999999\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://[::1]/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { FtpSocketDataProviderDirectoryListing ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); @@ -864,7 +899,7 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransaction) { TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { FtpSocketDataProviderDirectoryListingWithPasvFallback ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); @@ -872,7 +907,7 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithPasvFallback) { TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { FtpSocketDataProviderDirectoryListing ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host;type=d", 1, OK); EXPECT_TRUE(transaction_.GetResponseInfo()->is_directory_listing); EXPECT_EQ(-1, transaction_.GetResponseInfo()->expected_content_size); @@ -881,19 +916,19 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransactionWithTypecode) { TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcome) { FtpSocketDataProviderDirectoryListing ctrl_socket; ctrl_socket.set_multiline_welcome(true); - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads2) { FtpSocketDataProviderDirectoryListing ctrl_socket; ctrl_socket.set_short_read_limit(2); - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionShortReads5) { FtpSocketDataProviderDirectoryListing ctrl_socket; ctrl_socket.set_short_read_limit(5); - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { @@ -903,33 +938,33 @@ TEST_F(FtpNetworkTransactionTest, DirectoryTransactionMultilineWelcomeShort) { ctrl_socket.allow_unconsumed_reads(true); ctrl_socket.set_multiline_welcome(true); ctrl_socket.set_short_read_limit(5); - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } // Regression test for http://crbug.com/60555. TEST_F(FtpNetworkTransactionTest, DirectoryTransactionZeroSize) { FtpSocketDataProviderDirectoryListingZeroSize ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 0, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMS) { FtpSocketDataProviderVMSDirectoryListing ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/dir", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/dir", 1, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionVMSRootDirectory) { FtpSocketDataProviderVMSDirectoryListingRootDirectory ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionTransferStarting) { FtpSocketDataProviderDirectoryListingTransferStarting ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { FtpSocketDataProviderFileDownload ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); // We pass an artificial value of 18 as a response to the SIZE command. EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); @@ -940,7 +975,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransaction) { TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { FtpSocketDataProviderFileDownloadWithPasvFallback ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); // We pass an artificial value of 18 as a response to the SIZE command. EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); @@ -949,7 +984,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithPasvFallback) { TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; ctrl_socket.set_data_type('A'); - ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=a", 0, OK); // We pass an artificial value of 18 as a response to the SIZE command. EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); @@ -957,7 +992,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeA) { TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { FtpSocketDataProviderFileDownloadWithFileTypecode ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file;type=i", 0, OK); // We pass an artificial value of 18 as a response to the SIZE command. EXPECT_EQ(18, transaction_.GetResponseInfo()->expected_content_size); @@ -966,77 +1001,77 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionWithTypecodeI) { TEST_F(FtpNetworkTransactionTest, DownloadTransactionMultilineWelcome) { FtpSocketDataProviderFileDownload ctrl_socket; ctrl_socket.set_multiline_welcome(true); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads2) { FtpSocketDataProviderFileDownload ctrl_socket; ctrl_socket.set_short_read_limit(2); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionShortReads5) { FtpSocketDataProviderFileDownload ctrl_socket; ctrl_socket.set_short_read_limit(5); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionZeroSize) { FtpSocketDataProviderFileDownloadZeroSize ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionCWD451) { FtpSocketDataProviderFileDownloadCWD451 ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionVMS) { FtpSocketDataProviderVMSFileDownload ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionTransferStarting) { FtpSocketDataProviderFileDownloadTransferStarting ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionInvalidResponse) { FtpSocketDataProviderFileDownloadInvalidResponse ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvReallyBadFormat) { FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort1) { FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,0,22)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort2) { // Still unsafe. 1 * 256 + 2 = 258, which is < 1024. FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,1,2)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort3) { // Still unsafe. 3 * 256 + 4 = 772, which is < 1024. FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,3,4)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafePort4) { // Unsafe. 8 * 256 + 1 = 2049, which is used by nfs. FtpSocketDataProviderEvilPasv ctrl_socket("227 Portscan (127,0,0,1,8,1)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { @@ -1046,10 +1081,12 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { MockRead data_reads[] = { MockRead(mock_data.c_str()), }; - StaticSocketDataProvider data_socket1(data_reads, arraysize(data_reads), + StaticSocketDataProvider data_socket1; + StaticSocketDataProvider data_socket2(data_reads, arraysize(data_reads), NULL, 0); mock_socket_factory_.AddSocketDataProvider(&ctrl_socket); mock_socket_factory_.AddSocketDataProvider(&data_socket1); + mock_socket_factory_.AddSocketDataProvider(&data_socket2); FtpRequestInfo request_info = GetRequestInfo("ftp://host/file"); // Start the transaction. @@ -1077,95 +1114,95 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilPasvUnsafeHost) { TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat1) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat2) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat3) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat4) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (||||)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvReallyBadFormat5) { const char response[] = "227 Portscan (\0\0\031773\0)\r\n"; FtpSocketDataProviderEvilEpsv ctrl_socket(response, sizeof(response)-1, FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort1) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||22|)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort2) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||258|)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort3) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||772|)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvUnsafePort4) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|||2049|)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSep) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$31744$)\r\n", FtpSocketDataProvider::PRE_SIZE); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvWeirdSepUnsafePort) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan ($$$317$)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_UNSAFE_PORT); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_UNSAFE_PORT); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilEpsvIllegalHost) { FtpSocketDataProviderEvilEpsv ctrl_socket("227 Portscan (|2|::1|31744|)\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadUsername) { FtpSocketDataProviderEvilLogin ctrl_socket("hello%0Aworld", "test"); - ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://hello%0Aworld:test@host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilLoginBadPassword) { FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello%0Dworld"); - ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://test:hello%0Dworld@host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInLogin) { FtpSocketDataProviderEvilLogin ctrl_socket("hello world", "test"); - ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://hello%20world:test@host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, DownloadTransactionSpaceInPassword) { FtpSocketDataProviderEvilLogin ctrl_socket("test", "hello world"); - ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://test:hello%20world@host/file", 1, OK); } TEST_F(FtpNetworkTransactionTest, EvilRestartUser) { @@ -1240,7 +1277,7 @@ TEST_F(FtpNetworkTransactionTest, EvilRestartPassword) { TEST_F(FtpNetworkTransactionTest, Escaping) { FtpSocketDataProviderEscaping ctrl_socket; ExecuteTransaction(&ctrl_socket, "ftp://host/%20%21%22%23%24%25%79%80%81", - OK); + 1, OK); } // Test for http://crbug.com/23794. @@ -1249,7 +1286,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionEvilSize) { FtpSocketDataProviderEvilSize ctrl_socket( "213 99999999999999999999999999999999\r\n", FtpSocketDataProvider::PRE_QUIT); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_INVALID_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, ERR_INVALID_RESPONSE); } // Test for http://crbug.com/36360. @@ -1258,7 +1295,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { FtpSocketDataProviderEvilSize ctrl_socket( "213 3204427776\r\n", FtpSocketDataProvider::PRE_CWD); - ExecuteTransaction(&ctrl_socket, "ftp://host/file", OK); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 1, OK); EXPECT_EQ(3204427776LL, transaction_.GetResponseInfo()->expected_content_size); } @@ -1266,7 +1303,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionBigSize) { // Regression test for http://crbug.com/25023. TEST_F(FtpNetworkTransactionTest, CloseConnection) { FtpSocketDataProviderCloseConnection ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host", ERR_EMPTY_RESPONSE); + ExecuteTransaction(&ctrl_socket, "ftp://host", 1, ERR_EMPTY_RESPONSE); } TEST_F(FtpNetworkTransactionTest, DirectoryTransactionFailUser) { @@ -1458,7 +1495,7 @@ TEST_F(FtpNetworkTransactionTest, DownloadTransactionFailRetr) { TEST_F(FtpNetworkTransactionTest, FileNotFound) { FtpSocketDataProviderFileNotFound ctrl_socket; - ExecuteTransaction(&ctrl_socket, "ftp://host/file", ERR_FTP_FAILED); + ExecuteTransaction(&ctrl_socket, "ftp://host/file", 2, ERR_FTP_FAILED); } // Test for http://crbug.com/38845. |