| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/socket/ssl_client_socket.h" | 5 #include "net/socket/ssl_client_socket.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
| (...skipping 1228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1239 | 1239 |
| 1240 if (rv == ERR_IO_PENDING) | 1240 if (rv == ERR_IO_PENDING) |
| 1241 rv = callback.WaitForResult(); | 1241 rv = callback.WaitForResult(); |
| 1242 | 1242 |
| 1243 EXPECT_GE(rv, 0); | 1243 EXPECT_GE(rv, 0); |
| 1244 if (rv <= 0) | 1244 if (rv <= 0) |
| 1245 break; | 1245 break; |
| 1246 } | 1246 } |
| 1247 } | 1247 } |
| 1248 | 1248 |
| 1249 // Tests that SSLClientSocket properly handles when the underlying transport |
| 1250 // synchronously fails a transport read in during the handshake. The error code |
| 1251 // should be preserved so SSLv3 fallback logic can condition on it. |
| 1252 TEST_F(SSLClientSocketTest, Connect_WithSynchronousError) { |
| 1253 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1254 SpawnedTestServer::kLocalhost, |
| 1255 base::FilePath()); |
| 1256 ASSERT_TRUE(test_server.Start()); |
| 1257 |
| 1258 AddressList addr; |
| 1259 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| 1260 |
| 1261 TestCompletionCallback callback; |
| 1262 scoped_ptr<StreamSocket> real_transport( |
| 1263 new TCPClientSocket(addr, NULL, NetLog::Source())); |
| 1264 scoped_ptr<SynchronousErrorStreamSocket> transport( |
| 1265 new SynchronousErrorStreamSocket(real_transport.Pass())); |
| 1266 int rv = callback.GetResult(transport->Connect(callback.callback())); |
| 1267 EXPECT_EQ(OK, rv); |
| 1268 |
| 1269 // Disable TLS False Start to avoid handshake non-determinism. |
| 1270 SSLConfig ssl_config; |
| 1271 ssl_config.false_start_enabled = false; |
| 1272 |
| 1273 SynchronousErrorStreamSocket* raw_transport = transport.get(); |
| 1274 scoped_ptr<SSLClientSocket> sock( |
| 1275 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), |
| 1276 test_server.host_port_pair(), |
| 1277 ssl_config)); |
| 1278 |
| 1279 raw_transport->SetNextWriteError(ERR_CONNECTION_RESET); |
| 1280 |
| 1281 rv = callback.GetResult(sock->Connect(callback.callback())); |
| 1282 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1283 EXPECT_FALSE(sock->IsConnected()); |
| 1284 } |
| 1285 |
| 1249 // Tests that the SSLClientSocket properly handles when the underlying transport | 1286 // Tests that the SSLClientSocket properly handles when the underlying transport |
| 1250 // synchronously returns an error code - such as if an intermediary terminates | 1287 // synchronously returns an error code - such as if an intermediary terminates |
| 1251 // the socket connection uncleanly. | 1288 // the socket connection uncleanly. |
| 1252 // This is a regression test for http://crbug.com/238536 | 1289 // This is a regression test for http://crbug.com/238536 |
| 1253 TEST_F(SSLClientSocketTest, Read_WithSynchronousError) { | 1290 TEST_F(SSLClientSocketTest, Read_WithSynchronousError) { |
| 1254 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 1291 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1255 SpawnedTestServer::kLocalhost, | 1292 SpawnedTestServer::kLocalhost, |
| 1256 base::FilePath()); | 1293 base::FilePath()); |
| 1257 ASSERT_TRUE(test_server.Start()); | 1294 ASSERT_TRUE(test_server.Start()); |
| 1258 | 1295 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1293 | 1330 |
| 1294 // Simulate an unclean/forcible shutdown. | 1331 // Simulate an unclean/forcible shutdown. |
| 1295 raw_transport->SetNextReadError(ERR_CONNECTION_RESET); | 1332 raw_transport->SetNextReadError(ERR_CONNECTION_RESET); |
| 1296 | 1333 |
| 1297 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); | 1334 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); |
| 1298 | 1335 |
| 1299 // Note: This test will hang if this bug has regressed. Simply checking that | 1336 // Note: This test will hang if this bug has regressed. Simply checking that |
| 1300 // rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING is a legitimate | 1337 // rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING is a legitimate |
| 1301 // result when using a dedicated task runner for NSS. | 1338 // result when using a dedicated task runner for NSS. |
| 1302 rv = callback.GetResult(sock->Read(buf.get(), 4096, callback.callback())); | 1339 rv = callback.GetResult(sock->Read(buf.get(), 4096, callback.callback())); |
| 1303 | |
| 1304 #if !defined(USE_OPENSSL) | |
| 1305 // SSLClientSocketNSS records the error exactly | |
| 1306 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1340 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1307 #else | |
| 1308 // SSLClientSocketOpenSSL treats any errors as a simple EOF. | |
| 1309 EXPECT_EQ(0, rv); | |
| 1310 #endif | |
| 1311 } | 1341 } |
| 1312 | 1342 |
| 1313 // Tests that the SSLClientSocket properly handles when the underlying transport | 1343 // Tests that the SSLClientSocket properly handles when the underlying transport |
| 1314 // asynchronously returns an error code while writing data - such as if an | 1344 // asynchronously returns an error code while writing data - such as if an |
| 1315 // intermediary terminates the socket connection uncleanly. | 1345 // intermediary terminates the socket connection uncleanly. |
| 1316 // This is a regression test for http://crbug.com/249848 | 1346 // This is a regression test for http://crbug.com/249848 |
| 1317 TEST_F(SSLClientSocketTest, Write_WithSynchronousError) { | 1347 TEST_F(SSLClientSocketTest, Write_WithSynchronousError) { |
| 1318 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 1348 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1319 SpawnedTestServer::kLocalhost, | 1349 SpawnedTestServer::kLocalhost, |
| 1320 base::FilePath()); | 1350 base::FilePath()); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1374 EXPECT_EQ(ERR_IO_PENDING, rv); | 1404 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 1375 | 1405 |
| 1376 // Now unblock the outgoing request, having it fail with the connection | 1406 // Now unblock the outgoing request, having it fail with the connection |
| 1377 // being reset. | 1407 // being reset. |
| 1378 raw_transport->UnblockWrite(); | 1408 raw_transport->UnblockWrite(); |
| 1379 | 1409 |
| 1380 // Note: This will cause an inifite loop if this bug has regressed. Simply | 1410 // Note: This will cause an inifite loop if this bug has regressed. Simply |
| 1381 // checking that rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING | 1411 // checking that rv != ERR_IO_PENDING is insufficient, as ERR_IO_PENDING |
| 1382 // is a legitimate result when using a dedicated task runner for NSS. | 1412 // is a legitimate result when using a dedicated task runner for NSS. |
| 1383 rv = callback.GetResult(rv); | 1413 rv = callback.GetResult(rv); |
| 1384 | |
| 1385 #if !defined(USE_OPENSSL) | |
| 1386 // SSLClientSocketNSS records the error exactly | |
| 1387 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1414 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1388 #else | |
| 1389 // SSLClientSocketOpenSSL treats any errors as a simple EOF. | |
| 1390 EXPECT_EQ(0, rv); | |
| 1391 #endif | |
| 1392 } | 1415 } |
| 1393 | 1416 |
| 1394 // If there is a Write failure at the transport with no follow-up Read, although | 1417 // If there is a Write failure at the transport with no follow-up Read, although |
| 1395 // the write error will not be returned to the client until a future Read or | 1418 // the write error will not be returned to the client until a future Read or |
| 1396 // Write operation, SSLClientSocket should not spin attempting to re-write on | 1419 // Write operation, SSLClientSocket should not spin attempting to re-write on |
| 1397 // the socket. This is a regression test for part of https://crbug.com/381160. | 1420 // the socket. This is a regression test for part of https://crbug.com/381160. |
| 1398 TEST_F(SSLClientSocketTest, Write_WithSynchronousErrorNoRead) { | 1421 TEST_F(SSLClientSocketTest, Write_WithSynchronousErrorNoRead) { |
| 1399 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 1422 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1400 SpawnedTestServer::kLocalhost, | 1423 SpawnedTestServer::kLocalhost, |
| 1401 base::FilePath()); | 1424 base::FilePath()); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1624 callback.callback()); | 1647 callback.callback()); |
| 1625 ASSERT_EQ(ERR_IO_PENDING, rv); | 1648 ASSERT_EQ(ERR_IO_PENDING, rv); |
| 1626 ASSERT_FALSE(callback.have_result()); | 1649 ASSERT_FALSE(callback.have_result()); |
| 1627 | 1650 |
| 1628 // Now unblock Write(), which will invoke OnSendComplete and (eventually) | 1651 // Now unblock Write(), which will invoke OnSendComplete and (eventually) |
| 1629 // call the Read() callback, deleting the socket and thus aborting calling | 1652 // call the Read() callback, deleting the socket and thus aborting calling |
| 1630 // the Write() callback. | 1653 // the Write() callback. |
| 1631 raw_transport->UnblockWrite(); | 1654 raw_transport->UnblockWrite(); |
| 1632 | 1655 |
| 1633 rv = read_callback.WaitForResult(); | 1656 rv = read_callback.WaitForResult(); |
| 1634 | |
| 1635 #if !defined(USE_OPENSSL) | |
| 1636 // NSS records the error exactly. | |
| 1637 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1657 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1638 #else | |
| 1639 // OpenSSL treats any errors as a simple EOF. | |
| 1640 EXPECT_EQ(0, rv); | |
| 1641 #endif | |
| 1642 | 1658 |
| 1643 // The Write callback should not have been called. | 1659 // The Write callback should not have been called. |
| 1644 EXPECT_FALSE(callback.have_result()); | 1660 EXPECT_FALSE(callback.have_result()); |
| 1645 } | 1661 } |
| 1646 | 1662 |
| 1647 // Tests that the SSLClientSocket does not crash if data is received on the | 1663 // Tests that the SSLClientSocket does not crash if data is received on the |
| 1648 // transport socket after a failing write. This can occur if we have a Write | 1664 // transport socket after a failing write. This can occur if we have a Write |
| 1649 // error in a SPDY socket. | 1665 // error in a SPDY socket. |
| 1650 // Regression test for http://crbug.com/335557 | 1666 // Regression test for http://crbug.com/335557 |
| 1651 TEST_F(SSLClientSocketTest, Read_WithWriteError) { | 1667 TEST_F(SSLClientSocketTest, Read_WithWriteError) { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1726 rv = callback.GetResult(sock->Write(long_request_buffer.get(), | 1742 rv = callback.GetResult(sock->Write(long_request_buffer.get(), |
| 1727 long_request_buffer->BytesRemaining(), | 1743 long_request_buffer->BytesRemaining(), |
| 1728 callback.callback())); | 1744 callback.callback())); |
| 1729 if (rv > 0) { | 1745 if (rv > 0) { |
| 1730 long_request_buffer->DidConsume(rv); | 1746 long_request_buffer->DidConsume(rv); |
| 1731 // Abort if the entire buffer is ever consumed. | 1747 // Abort if the entire buffer is ever consumed. |
| 1732 ASSERT_LT(0, long_request_buffer->BytesRemaining()); | 1748 ASSERT_LT(0, long_request_buffer->BytesRemaining()); |
| 1733 } | 1749 } |
| 1734 } while (rv > 0); | 1750 } while (rv > 0); |
| 1735 | 1751 |
| 1736 #if !defined(USE_OPENSSL) | |
| 1737 // NSS records the error exactly. | |
| 1738 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1752 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1739 #else | |
| 1740 // OpenSSL treats the reset as a generic protocol error. | |
| 1741 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, rv); | |
| 1742 #endif | |
| 1743 | 1753 |
| 1744 // Release the read. Some bytes should go through. | 1754 // Release the read. |
| 1745 raw_transport->UnblockReadResult(); | 1755 raw_transport->UnblockReadResult(); |
| 1746 rv = read_callback.WaitForResult(); | 1756 rv = read_callback.WaitForResult(); |
| 1747 | 1757 |
| 1748 // Per the fix for http://crbug.com/249848, write failures currently break | 1758 #if defined(USE_OPENSSL) |
| 1749 // reads. Change this assertion if they're changed to not collide. | 1759 // Should still read bytes despite the write error. |
| 1760 EXPECT_LT(0, rv); |
| 1761 #else |
| 1762 // NSS attempts to flush the write buffer in PR_Read on an SSL socket before |
| 1763 // pumping the read state machine, unless configured with SSL_ENABLE_FDX, so |
| 1764 // the write error stops future reads. |
| 1750 EXPECT_EQ(ERR_CONNECTION_RESET, rv); | 1765 EXPECT_EQ(ERR_CONNECTION_RESET, rv); |
| 1766 #endif |
| 1751 } | 1767 } |
| 1752 | 1768 |
| 1753 TEST_F(SSLClientSocketTest, Read_SmallChunks) { | 1769 TEST_F(SSLClientSocketTest, Read_SmallChunks) { |
| 1754 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, | 1770 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, |
| 1755 SpawnedTestServer::kLocalhost, | 1771 SpawnedTestServer::kLocalhost, |
| 1756 base::FilePath()); | 1772 base::FilePath()); |
| 1757 ASSERT_TRUE(test_server.Start()); | 1773 ASSERT_TRUE(test_server.Start()); |
| 1758 | 1774 |
| 1759 AddressList addr; | 1775 AddressList addr; |
| 1760 ASSERT_TRUE(test_server.GetAddressList(&addr)); | 1776 ASSERT_TRUE(test_server.GetAddressList(&addr)); |
| (...skipping 1030 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2791 ssl_config.channel_id_enabled = true; | 2807 ssl_config.channel_id_enabled = true; |
| 2792 | 2808 |
| 2793 int rv; | 2809 int rv; |
| 2794 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); | 2810 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); |
| 2795 | 2811 |
| 2796 EXPECT_EQ(ERR_UNEXPECTED, rv); | 2812 EXPECT_EQ(ERR_UNEXPECTED, rv); |
| 2797 EXPECT_FALSE(sock_->IsConnected()); | 2813 EXPECT_FALSE(sock_->IsConnected()); |
| 2798 } | 2814 } |
| 2799 | 2815 |
| 2800 } // namespace net | 2816 } // namespace net |
| OLD | NEW |