From e7314cd4a2adde330eb79825acdb60c27558b731 Mon Sep 17 00:00:00 2001 From: Ilya Nikolaevskiy Date: Mon, 30 Sep 2019 11:36:42 +0200 Subject: [PATCH] In ulpfec receiver check for malformed packets to avoid DCHECKS tirggering If the packet can't be parsed, the buffer isn't moved to the packet. Then, a new empty buffer is moved back from the packet. Thus, the consequtive DCHECK fails because the data isn't the same anymore. Bug: chromium:1009236 Change-Id: Ie27f438c40f38074d42d8491fe03df45d50eba50 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/155162 Commit-Queue: Ilya Nikolaevskiy Reviewed-by: Danil Chapovalov Cr-Commit-Position: refs/heads/master@{#29340} --- .../rtp_rtcp/source/ulpfec_receiver_impl.cc | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc b/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc index 24348f3c2b..ea85422ffe 100644 --- a/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc +++ b/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc @@ -172,15 +172,18 @@ int32_t UlpfecReceiverImpl::ProcessReceivedFec() { // Create a packet with the buffer to modify it. RtpPacketReceived rtp_packet; const uint8_t* const original_data = packet->data.cdata(); - rtp_packet.Parse(packet->data); - rtp_packet.IdentifyExtensions(extensions_); - // Reset buffer reference, so zeroing would work on a buffer with a - // single reference. - packet->data = rtc::CopyOnWriteBuffer(0); - rtp_packet.ZeroMutableExtensions(); - packet->data = rtp_packet.Buffer(); - // Ensure that zeroing of extensions was done in place. - RTC_DCHECK_EQ(packet->data.cdata(), original_data); + if (!rtp_packet.Parse(packet->data)) { + RTC_LOG(LS_WARNING) << "Corrupted media packet"; + } else { + rtp_packet.IdentifyExtensions(extensions_); + // Reset buffer reference, so zeroing would work on a buffer with a + // single reference. + packet->data = rtc::CopyOnWriteBuffer(0); + rtp_packet.ZeroMutableExtensions(); + packet->data = rtp_packet.Buffer(); + // Ensure that zeroing of extensions was done in place. + RTC_DCHECK_EQ(packet->data.cdata(), original_data); + } } fec_->DecodeFec(*received_packet, &recovered_packets_); }