Don't crash on sending empty MOQT datagrams. PiperOrigin-RevId: 998811564
diff --git a/quiche/quic/moqt/moqt_live_publisher.cc b/quiche/quic/moqt/moqt_live_publisher.cc index ea76f28..9c4639e 100644 --- a/quiche/quic/moqt/moqt_live_publisher.cc +++ b/quiche/quic/moqt/moqt_live_publisher.cc
@@ -382,9 +382,16 @@ QUICHE_BUG_IF(LivePublisher_SendDatagram_partial_payload, object->payload.size() > 1) << "Datagram is split into multiple slices"; - quiche::QuicheBuffer datagram = framer_.SerializeObjectDatagram( - header, object->payload[0].AsStringView(), - default_publisher_priority_.value_or(kDefaultPublisherPriority)); + quiche::QuicheBuffer datagram; + if (object->payload.empty()) { + datagram = framer_.SerializeObjectDatagram( + header, "", + default_publisher_priority_.value_or(kDefaultPublisherPriority)); + } else { + datagram = framer_.SerializeObjectDatagram( + header, object->payload[0].AsStringView(), + default_publisher_priority_.value_or(kDefaultPublisherPriority)); + } if (visitor() == nullptr) { return; }
diff --git a/quiche/quic/moqt/moqt_live_publisher_test.cc b/quiche/quic/moqt/moqt_live_publisher_test.cc index 9e3610f..c4ccc13 100644 --- a/quiche/quic/moqt/moqt_live_publisher_test.cc +++ b/quiche/quic/moqt/moqt_live_publisher_test.cc
@@ -529,6 +529,31 @@ publisher_->OnNewObjectAvailable(Location(1, 0), std::nullopt, 128); } +TEST_F(LivePublisherTest, OnNewObjectAvailableStatusDatagram) { + PublishedObjectMetadata metadata{Location(1, 0), + /*subgroup=*/std::nullopt, + /*properties=*/"", + MoqtObjectStatus::kEndOfGroup, + /*publisher_priority=*/128, + /*first_object_in_subgroup=*/std::nullopt, + /*payload_length=*/0}; + EXPECT_CALL(*track_publisher_, + GetCachedObject(1, std::optional<uint64_t>(), 0, 0)) + .WillOnce(Return(PublishedObject{metadata, {}, false})) + .WillOnce(Return(PublishedObject{metadata, {}, false})); + EXPECT_CALL(webtrans_, SendOrQueueDatagram) + .WillOnce([](absl::string_view datagram) { + MoqtObject message; + bool use_default_priority; + absl::StatusOr<absl::string_view> payload = + ParseDatagram(datagram, message, use_default_priority); + EXPECT_TRUE(payload.ok() && payload->empty()); + EXPECT_EQ(message.object_status, MoqtObjectStatus::kEndOfGroup); + return DatagramStatus(DatagramStatusCode::kSuccess, ""); + }); + publisher_->OnNewObjectAvailable(Location(1, 0), std::nullopt, 128); +} + TEST_F(LivePublisherTest, OnNewObjectAvailableStreamCreationBlocked) { CreatePendingStream(Location(1, 0), 0, 128); }