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