Do not crash if time wait list tries to send or queue null packets.

PiperOrigin-RevId: 369296875
Change-Id: I53285101f68af9a08dc46f1e4ce9d6da29626014
diff --git a/quic/core/quic_time_wait_list_manager.cc b/quic/core/quic_time_wait_list_manager.cc
index d6fa2da..5233d6d 100644
--- a/quic/core/quic_time_wait_list_manager.cc
+++ b/quic/core/quic_time_wait_list_manager.cc
@@ -18,6 +18,7 @@
 #include "quic/core/quic_framer.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_utils.h"
+#include "quic/platform/api/quic_bug_tracker.h"
 #include "quic/platform/api/quic_flag_utils.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_logging.h"
@@ -381,6 +382,10 @@
 bool QuicTimeWaitListManager::SendOrQueuePacket(
     std::unique_ptr<QueuedPacket> packet,
     const QuicPerPacketContext* /*packet_context*/) {
+  if (packet == nullptr) {
+    QUIC_LOG(ERROR) << "Tried to send or queue a null packet";
+    return true;
+  }
   if (WriteToWire(packet.get())) {
     // Allow the packet to be deleted upon leaving this function.
     return true;
diff --git a/quic/core/quic_time_wait_list_manager_test.cc b/quic/core/quic_time_wait_list_manager_test.cc
index d33e992..d203288 100644
--- a/quic/core/quic_time_wait_list_manager_test.cc
+++ b/quic/core/quic_time_wait_list_manager_test.cc
@@ -19,6 +19,7 @@
 #include "quic/core/quic_packet_writer.h"
 #include "quic/core/quic_packets.h"
 #include "quic/core/quic_utils.h"
+#include "quic/platform/api/quic_expect_bug.h"
 #include "quic/platform/api/quic_flags.h"
 #include "quic/platform/api/quic_test.h"
 #include "quic/test_tools/mock_quic_session_visitor.h"
@@ -749,6 +750,11 @@
   }
 }
 
+TEST_F(QuicTimeWaitListManagerTest, SendOrQueueNullPacket) {
+  QuicTimeWaitListManagerPeer::SendOrQueuePacket(&time_wait_list_manager_,
+                                                 nullptr, nullptr);
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic
diff --git a/quic/test_tools/quic_time_wait_list_manager_peer.cc b/quic/test_tools/quic_time_wait_list_manager_peer.cc
index 9d60443..8f614e8 100644
--- a/quic/test_tools/quic_time_wait_list_manager_peer.cc
+++ b/quic/test_tools/quic_time_wait_list_manager_peer.cc
@@ -28,5 +28,13 @@
   manager->clock_ = clock;
 }
 
+// static
+bool QuicTimeWaitListManagerPeer::SendOrQueuePacket(
+    QuicTimeWaitListManager* manager,
+    std::unique_ptr<QuicTimeWaitListManager::QueuedPacket> packet,
+    const QuicPerPacketContext* packet_context) {
+  return manager->SendOrQueuePacket(std::move(packet), packet_context);
+}
+
 }  // namespace test
 }  // namespace quic
diff --git a/quic/test_tools/quic_time_wait_list_manager_peer.h b/quic/test_tools/quic_time_wait_list_manager_peer.h
index 54fd6dd..4e0a4a7 100644
--- a/quic/test_tools/quic_time_wait_list_manager_peer.h
+++ b/quic/test_tools/quic_time_wait_list_manager_peer.h
@@ -21,6 +21,11 @@
 
   static void set_clock(QuicTimeWaitListManager* manager,
                         const QuicClock* clock);
+
+  static bool SendOrQueuePacket(
+      QuicTimeWaitListManager* manager,
+      std::unique_ptr<QuicTimeWaitListManager::QueuedPacket> packet,
+      const QuicPerPacketContext* packet_context);
 };
 
 }  // namespace test