Stop using "delete connection()" in QuicSession classes and use DeleteConnection() instead, which prevents double deletion and sets connection_ to nullptr. gfe-relnote: n/a (Set deleted pointer to nullptr) PiperOrigin-RevId: 284764494 Change-Id: I6d7f36768e14f06b9cd8267ac74d22d189463579
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc index ddf30fe..a1b1b3c 100644 --- a/quic/core/http/quic_server_session_base_test.cc +++ b/quic/core/http/quic_server_session_base_test.cc
@@ -65,7 +65,7 @@ compressed_certs_cache), quic_simple_server_backend_(quic_simple_server_backend) {} - ~TestServerSession() override { delete connection(); } + ~TestServerSession() override { DeleteConnection(); } protected: QuicSpdyStream* CreateIncomingStream(QuicStreamId id) override {
diff --git a/quic/core/http/quic_spdy_client_session_base.cc b/quic/core/http/quic_spdy_client_session_base.cc index 7dd2aec..b19ea1a 100644 --- a/quic/core/http/quic_spdy_client_session_base.cc +++ b/quic/core/http/quic_spdy_client_session_base.cc
@@ -32,7 +32,7 @@ QUIC_DVLOG(1) << "erase stream " << it.first << " url " << it.second->url(); push_promise_index_->promised_by_url()->erase(it.second->url()); } - delete connection(); + DeleteConnection(); } void QuicSpdyClientSessionBase::OnConfigNegotiated() {
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc index b37246a..bf5004e 100644 --- a/quic/core/http/quic_spdy_session_test.cc +++ b/quic/core/http/quic_spdy_session_test.cc
@@ -193,7 +193,7 @@ std::make_unique<NullEncrypter>(connection->perspective())); } - ~TestSession() override { delete connection(); } + ~TestSession() override { DeleteConnection(); } TestCryptoStream* GetMutableCryptoStream() override { return &crypto_stream_;
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc index 51d851d..85c9d7c 100644 --- a/quic/core/quic_dispatcher_test.cc +++ b/quic/core/quic_dispatcher_test.cc
@@ -71,7 +71,7 @@ TestQuicSpdyServerSession& operator=(const TestQuicSpdyServerSession&) = delete; - ~TestQuicSpdyServerSession() override { delete connection(); } + ~TestQuicSpdyServerSession() override { DeleteConnection(); } MOCK_METHOD2(OnConnectionClosed, void(const QuicConnectionCloseFrame& frame,
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc index c0f5992..2b50ebc 100644 --- a/quic/core/quic_session.cc +++ b/quic/core/quic_session.cc
@@ -1615,6 +1615,13 @@ return v99_streamid_manager_.GetLargestPeerCreatedStreamId(unidirectional); } +void QuicSession::DeleteConnection() { + if (connection_) { + delete connection_; + connection_ = nullptr; + } +} + bool QuicSession::IsClosedStream(QuicStreamId id) { DCHECK_NE(QuicUtils::GetInvalidStreamId(transport_version()), id); if (IsOpenStream(id)) {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h index c6861f9..eb9cdfe 100644 --- a/quic/core/quic_session.h +++ b/quic/core/quic_session.h
@@ -626,6 +626,10 @@ // indicated by |unidirectional|. QuicStreamId GetLargestPeerCreatedStreamId(bool unidirectional) const; + // Deletes the connection and sets it to nullptr, so calling it mulitiple + // times is safe. + void DeleteConnection(); + private: friend class test::QuicSessionPeer;
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc index 4603d6c..5c04379 100644 --- a/quic/core/quic_session_test.cc +++ b/quic/core/quic_session_test.cc
@@ -170,9 +170,7 @@ std::make_unique<NullEncrypter>(connection->perspective())); } - ~TestSession() override { - delete connection(); - } + ~TestSession() override { DeleteConnection(); } TestCryptoStream* GetMutableCryptoStream() override { return &crypto_stream_;
diff --git a/quic/qbone/qbone_client.cc b/quic/qbone/qbone_client.cc index 95e3aea..73869d8 100644 --- a/quic/qbone/qbone_client.cc +++ b/quic/qbone/qbone_client.cc
@@ -85,7 +85,7 @@ public: using QboneClientSession::QboneClientSession; - ~QboneClientSessionWithConnection() override { delete connection(); } + ~QboneClientSessionWithConnection() override { DeleteConnection(); } }; // Takes ownership of |connection|.
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc index 8099c34..156d00e 100644 --- a/quic/test_tools/quic_test_utils.cc +++ b/quic/test_tools/quic_test_utils.cc
@@ -553,7 +553,7 @@ } MockQuicSession::~MockQuicSession() { - delete connection(); + DeleteConnection(); } QuicCryptoStream* MockQuicSession::GetMutableCryptoStream() { @@ -624,7 +624,7 @@ } MockQuicSpdySession::~MockQuicSpdySession() { - delete connection(); + DeleteConnection(); } QuicCryptoStream* MockQuicSpdySession::GetMutableCryptoStream() { @@ -657,7 +657,7 @@ } TestQuicSpdyServerSession::~TestQuicSpdyServerSession() { - delete connection(); + DeleteConnection(); } QuicCryptoServerStreamBase*
diff --git a/quic/tools/quic_simple_server_session.cc b/quic/tools/quic_simple_server_session.cc index c60a9e2..aa13a5b 100644 --- a/quic/tools/quic_simple_server_session.cc +++ b/quic/tools/quic_simple_server_session.cc
@@ -39,7 +39,7 @@ } QuicSimpleServerSession::~QuicSimpleServerSession() { - delete connection(); + DeleteConnection(); } QuicCryptoServerStreamBase*
diff --git a/quic/tools/quic_transport_simple_server_session.cc b/quic/tools/quic_transport_simple_server_session.cc index 60cedd5..b1221ae 100644 --- a/quic/tools/quic_transport_simple_server_session.cc +++ b/quic/tools/quic_transport_simple_server_session.cc
@@ -147,7 +147,7 @@ QuicTransportSimpleServerSession::~QuicTransportSimpleServerSession() { if (owns_connection_) { - delete connection(); + DeleteConnection(); } }