Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(796)

Unified Diff: net/quic/chromium/quic_stream_factory_test.cc

Issue 2277953002: Fixes use-after-free with Server Migration (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: Removed DVLOG Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/chromium/quic_stream_factory_test.cc
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc
index 0f2755ea5ab9e2fd5e1338137c068780e7c7bbea..4fa92dab8f9847b08e0b0a1fd2ade230973dfd16 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -512,8 +512,6 @@ class QuicStreamFactoryTestBase {
ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
- crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
-
crypto_client_stream_factory_.SetConfig(config);
// Set up first socket data provider.
@@ -521,16 +519,21 @@ class QuicStreamFactoryTestBase {
SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0);
socket_factory_.AddSocketDataProvider(&socket_data1);
- // Set up second socket data provider that is used after
- // migration.
- std::unique_ptr<QuicEncryptedPacket> ping(
+ // Set up second socket data provider that is used after migration.
+ std::unique_ptr<QuicEncryptedPacket> sendping(
client_maker_.MakePingPacket(1, /*include_version=*/true));
- std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket(
- 2, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED));
+ std::unique_ptr<QuicEncryptedPacket> client_rst(
+ client_maker_.MakeAckAndRstPacket(2, false, kClientDataStreamId1,
+ QUIC_STREAM_CANCELLED, 1, 1, 1,
+ true));
MockWrite writes2[] = {
- MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1),
- MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 2)};
- MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
+ MockWrite(SYNCHRONOUS, sendping->data(), sendping->length(), 0),
+ MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
+ std::unique_ptr<QuicEncryptedPacket> recvping(
+ client_maker_.MakePingPacket(1, /*include_version=*/false));
+ MockRead reads2[] = {
+ MockRead(ASYNC, recvping->data(), recvping->length(), 1),
+ MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2,
arraysize(writes2));
socket_factory_.AddSocketDataProvider(&socket_data2);
@@ -551,7 +554,6 @@ class QuicStreamFactoryTestBase {
request_info.url = GURL("https://www.example.org/");
EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
net_log_, CompletionCallback()));
-
// Ensure that session is alive and active.
QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
@@ -829,6 +831,49 @@ TEST_P(QuicStreamFactoryTest, Pooling) {
EXPECT_TRUE(socket_data.AllWriteDataConsumed());
}
+TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
+ // Set up session to migrate.
+ host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
+ "192.168.0.1", "");
+ IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
+ QuicConfig config;
+ config.SetAlternateServerAddressToSend(alt_address);
+
+ VerifyServerMigration(config, alt_address);
+
+ // Close server-migrated session.
+ QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
+ session->CloseSessionOnError(0u, QUIC_NO_ERROR);
+
+ // Set up server IP, socket, proof, and config for new session.
+ HostPortPair server2(kServer2HostName, kDefaultServerPort);
+ host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
+
+ MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
+ SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
+ socket_factory_.AddSocketDataProvider(&socket_data);
+
+ ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
+ crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
+ QuicConfig config2;
+ crypto_client_stream_factory_.SetConfig(config2);
+
+ // Create new request to cause new session creation.
+ TestCompletionCallback callback;
+ QuicStreamRequest request2(factory_.get());
+ EXPECT_EQ(ERR_IO_PENDING,
+ request2.Request(server2, privacy_mode_,
+ /*cert_verify_flags=*/0, url2_, "GET", net_log_,
+ callback.callback()));
+ EXPECT_EQ(OK, callback.WaitForResult());
+ std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
+ EXPECT_TRUE(stream2.get());
+
+ EXPECT_TRUE(socket_data.AllReadDataConsumed());
+ EXPECT_TRUE(socket_data.AllWriteDataConsumed());
+ // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
+}
+
TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
disable_connection_pooling_ = true;
Initialize();
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698