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

Side by Side 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, 3 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 unified diff | Download patch
« no previous file with comments | « net/quic/chromium/quic_stream_factory.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/quic/chromium/quic_stream_factory.h" 5 #include "net/quic/chromium/quic_stream_factory.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
505 std::move(headers), &spdy_headers_frame_len); 505 std::move(headers), &spdy_headers_frame_len);
506 } 506 }
507 507
508 // Helper method for server migration tests. 508 // Helper method for server migration tests.
509 void VerifyServerMigration(QuicConfig& config, IPEndPoint expected_address) { 509 void VerifyServerMigration(QuicConfig& config, IPEndPoint expected_address) {
510 allow_server_migration_ = true; 510 allow_server_migration_ = true;
511 Initialize(); 511 Initialize();
512 512
513 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 513 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 514 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
515 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
516
517 crypto_client_stream_factory_.SetConfig(config); 515 crypto_client_stream_factory_.SetConfig(config);
518 516
519 // Set up first socket data provider. 517 // Set up first socket data provider.
520 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 518 MockRead reads1[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
521 SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0); 519 SequencedSocketData socket_data1(reads1, arraysize(reads1), nullptr, 0);
522 socket_factory_.AddSocketDataProvider(&socket_data1); 520 socket_factory_.AddSocketDataProvider(&socket_data1);
523 521
524 // Set up second socket data provider that is used after 522 // Set up second socket data provider that is used after migration.
525 // migration. 523 std::unique_ptr<QuicEncryptedPacket> sendping(
526 std::unique_ptr<QuicEncryptedPacket> ping(
527 client_maker_.MakePingPacket(1, /*include_version=*/true)); 524 client_maker_.MakePingPacket(1, /*include_version=*/true));
528 std::unique_ptr<QuicEncryptedPacket> client_rst(client_maker_.MakeRstPacket( 525 std::unique_ptr<QuicEncryptedPacket> client_rst(
529 2, true, kClientDataStreamId1, QUIC_STREAM_CANCELLED)); 526 client_maker_.MakeAckAndRstPacket(2, false, kClientDataStreamId1,
527 QUIC_STREAM_CANCELLED, 1, 1, 1,
528 true));
530 MockWrite writes2[] = { 529 MockWrite writes2[] = {
531 MockWrite(SYNCHRONOUS, ping->data(), ping->length(), 1), 530 MockWrite(SYNCHRONOUS, sendping->data(), sendping->length(), 0),
532 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 2)}; 531 MockWrite(SYNCHRONOUS, client_rst->data(), client_rst->length(), 3)};
533 MockRead reads2[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 532 std::unique_ptr<QuicEncryptedPacket> recvping(
533 client_maker_.MakePingPacket(1, /*include_version=*/false));
534 MockRead reads2[] = {
535 MockRead(ASYNC, recvping->data(), recvping->length(), 1),
536 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 2)};
534 SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2, 537 SequencedSocketData socket_data2(reads2, arraysize(reads2), writes2,
535 arraysize(writes2)); 538 arraysize(writes2));
536 socket_factory_.AddSocketDataProvider(&socket_data2); 539 socket_factory_.AddSocketDataProvider(&socket_data2);
537 540
538 // Create request and QuicHttpStream. 541 // Create request and QuicHttpStream.
539 QuicStreamRequest request(factory_.get()); 542 QuicStreamRequest request(factory_.get());
540 EXPECT_EQ(ERR_IO_PENDING, 543 EXPECT_EQ(ERR_IO_PENDING,
541 request.Request(host_port_pair_, privacy_mode_, 544 request.Request(host_port_pair_, privacy_mode_,
542 /*cert_verify_flags=*/0, url_, "GET", net_log_, 545 /*cert_verify_flags=*/0, url_, "GET", net_log_,
543 callback_.callback())); 546 callback_.callback()));
544 EXPECT_EQ(OK, callback_.WaitForResult()); 547 EXPECT_EQ(OK, callback_.WaitForResult());
545 std::unique_ptr<QuicHttpStream> stream = request.CreateStream(); 548 std::unique_ptr<QuicHttpStream> stream = request.CreateStream();
546 EXPECT_TRUE(stream.get()); 549 EXPECT_TRUE(stream.get());
547 550
548 // Cause QUIC stream to be created. 551 // Cause QUIC stream to be created.
549 HttpRequestInfo request_info; 552 HttpRequestInfo request_info;
550 request_info.method = "GET"; 553 request_info.method = "GET";
551 request_info.url = GURL("https://www.example.org/"); 554 request_info.url = GURL("https://www.example.org/");
552 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY, 555 EXPECT_EQ(OK, stream->InitializeStream(&request_info, DEFAULT_PRIORITY,
553 net_log_, CompletionCallback())); 556 net_log_, CompletionCallback()));
554
555 // Ensure that session is alive and active. 557 // Ensure that session is alive and active.
556 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_); 558 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
557 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session)); 559 EXPECT_TRUE(QuicStreamFactoryPeer::IsLiveSession(factory_.get(), session));
558 EXPECT_TRUE(HasActiveSession(host_port_pair_)); 560 EXPECT_TRUE(HasActiveSession(host_port_pair_));
559 561
560 IPEndPoint actual_address; 562 IPEndPoint actual_address;
561 session->GetDefaultSocket()->GetPeerAddress(&actual_address); 563 session->GetDefaultSocket()->GetPeerAddress(&actual_address);
562 EXPECT_EQ(actual_address, expected_address); 564 EXPECT_EQ(actual_address, expected_address);
563 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString() 565 DVLOG(1) << "Socket connected to: " << actual_address.address().ToString()
564 << " " << actual_address.port(); 566 << " " << actual_address.port();
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 net_log_, callback.callback())); 824 net_log_, callback.callback()));
823 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream(); 825 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
824 EXPECT_TRUE(stream2.get()); 826 EXPECT_TRUE(stream2.get());
825 827
826 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2)); 828 EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
827 829
828 EXPECT_TRUE(socket_data.AllReadDataConsumed()); 830 EXPECT_TRUE(socket_data.AllReadDataConsumed());
829 EXPECT_TRUE(socket_data.AllWriteDataConsumed()); 831 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
830 } 832 }
831 833
834 TEST_P(QuicStreamFactoryTest, PoolingWithServerMigration) {
835 // Set up session to migrate.
836 host_resolver_.rules()->AddIPLiteralRule(host_port_pair_.host(),
837 "192.168.0.1", "");
838 IPEndPoint alt_address = IPEndPoint(IPAddress(1, 2, 3, 4), 443);
839 QuicConfig config;
840 config.SetAlternateServerAddressToSend(alt_address);
841
842 VerifyServerMigration(config, alt_address);
843
844 // Close server-migrated session.
845 QuicChromiumClientSession* session = GetActiveSession(host_port_pair_);
846 session->CloseSessionOnError(0u, QUIC_NO_ERROR);
847
848 // Set up server IP, socket, proof, and config for new session.
849 HostPortPair server2(kServer2HostName, kDefaultServerPort);
850 host_resolver_.rules()->AddIPLiteralRule(server2.host(), "192.168.0.1", "");
851
852 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
853 SequencedSocketData socket_data(reads, arraysize(reads), nullptr, 0);
854 socket_factory_.AddSocketDataProvider(&socket_data);
855
856 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
857 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
858 QuicConfig config2;
859 crypto_client_stream_factory_.SetConfig(config2);
860
861 // Create new request to cause new session creation.
862 TestCompletionCallback callback;
863 QuicStreamRequest request2(factory_.get());
864 EXPECT_EQ(ERR_IO_PENDING,
865 request2.Request(server2, privacy_mode_,
866 /*cert_verify_flags=*/0, url2_, "GET", net_log_,
867 callback.callback()));
868 EXPECT_EQ(OK, callback.WaitForResult());
869 std::unique_ptr<QuicHttpStream> stream2 = request2.CreateStream();
870 EXPECT_TRUE(stream2.get());
871
872 EXPECT_TRUE(socket_data.AllReadDataConsumed());
873 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
874 // EXPECT_EQ(GetActiveSession(host_port_pair_), GetActiveSession(server2));
875 }
876
832 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) { 877 TEST_P(QuicStreamFactoryTest, NoPoolingIfDisabled) {
833 disable_connection_pooling_ = true; 878 disable_connection_pooling_ = true;
834 Initialize(); 879 Initialize();
835 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails(); 880 ProofVerifyDetailsChromium verify_details = DefaultProofVerifyDetails();
836 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 881 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
837 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details); 882 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
838 883
839 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 884 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
840 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0); 885 SequencedSocketData socket_data1(reads, arraysize(reads), nullptr, 0);
841 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0); 886 SequencedSocketData socket_data2(reads, arraysize(reads), nullptr, 0);
(...skipping 4336 matching lines...) Expand 10 before | Expand all | Expand 10 after
5178 // Clear all cached states. 5223 // Clear all cached states.
5179 factory_->ClearCachedStatesInCryptoConfig( 5224 factory_->ClearCachedStatesInCryptoConfig(
5180 base::Callback<bool(const GURL&)>()); 5225 base::Callback<bool(const GURL&)>());
5181 EXPECT_TRUE(test_cases[0].state->certs().empty()); 5226 EXPECT_TRUE(test_cases[0].state->certs().empty());
5182 EXPECT_TRUE(test_cases[1].state->certs().empty()); 5227 EXPECT_TRUE(test_cases[1].state->certs().empty());
5183 EXPECT_TRUE(test_cases[2].state->certs().empty()); 5228 EXPECT_TRUE(test_cases[2].state->certs().empty());
5184 } 5229 }
5185 5230
5186 } // namespace test 5231 } // namespace test
5187 } // namespace net 5232 } // namespace net
OLDNEW
« 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