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