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();
}
}