Chromium Code Reviews| Index: webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc |
| diff --git a/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc b/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc |
| index 9d9550b0b1bf966d667604df42866cb27af7760b..ce240860a5881cf6b2260054611db071f7e2b9de 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/fec_receiver_impl.cc |
| @@ -81,11 +81,16 @@ int32_t FecReceiverImpl::AddReceivedRedPacket( |
| uint8_t REDHeaderLength = 1; |
| size_t payload_data_length = packet_length - header.headerLength; |
| + if (payload_data_length == 0) { |
| + LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; |
| + return -1; |
| + } |
| + |
| // Add to list without RED header, aka a virtual RTP packet |
| // we remove the RED header |
| - ForwardErrorCorrection::ReceivedPacket* received_packet = |
| - new ForwardErrorCorrection::ReceivedPacket; |
| + rtc::scoped_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet( |
| + new ForwardErrorCorrection::ReceivedPacket); |
| received_packet->pkt = new ForwardErrorCorrection::Packet; |
| // get payload type from RED header |
| @@ -99,16 +104,18 @@ int32_t FecReceiverImpl::AddReceivedRedPacket( |
| if (incoming_rtp_packet[header.headerLength] & 0x80) { |
| // f bit set in RED header |
| REDHeaderLength = 4; |
| + if (payload_data_length < REDHeaderLength) { |
| + LOG(LS_WARNING) << "Corrupt/truncated FEC packet."; |
| + return -1; |
| + } |
| + |
| uint16_t timestamp_offset = |
| (incoming_rtp_packet[header.headerLength + 1]) << 8; |
| timestamp_offset += |
| incoming_rtp_packet[header.headerLength + 2]; |
| timestamp_offset = timestamp_offset >> 2; |
| if (timestamp_offset != 0) { |
| - // |timestampOffset| should be 0. However, it's possible this is the first |
| - // location a corrupt payload can be caught, so don't assert. |
| LOG(LS_WARNING) << "Corrupt payload found."; |
| - delete received_packet; |
| return -1; |
| } |
| @@ -118,21 +125,18 @@ int32_t FecReceiverImpl::AddReceivedRedPacket( |
| // check next RED header |
| if (incoming_rtp_packet[header.headerLength + 4] & 0x80) { |
| - // more than 2 blocks in packet not supported |
| - delete received_packet; |
| - assert(false); |
| + LOG(LS_WARNING) << "More than 2 blocks in packet not supported."; |
| return -1; |
| } |
| if (blockLength > payload_data_length - REDHeaderLength) { |
| - // block length longer than packet |
| - delete received_packet; |
| - assert(false); |
| + LOG(LS_WARNING) << "Block length longer than packet."; |
| return -1; |
| } |
| } |
| ++packet_counter_.num_packets; |
| - ForwardErrorCorrection::ReceivedPacket* second_received_packet = NULL; |
| + rtc::scoped_ptr<ForwardErrorCorrection::ReceivedPacket> |
| + second_received_packet; |
|
stefan-webrtc
2015/06/29 13:33:21
Is this guaranteed to be null if you call release(
pbos-webrtc
2015/06/29 13:34:03
This is default-constructed to nullptr.
|
| if (blockLength > 0) { |
| // handle block length, split into 2 packets |
| REDHeaderLength = 5; |
| @@ -154,7 +158,7 @@ int32_t FecReceiverImpl::AddReceivedRedPacket( |
| received_packet->pkt->length = blockLength; |
| - second_received_packet = new ForwardErrorCorrection::ReceivedPacket; |
| + second_received_packet.reset(new ForwardErrorCorrection::ReceivedPacket); |
| second_received_packet->pkt = new ForwardErrorCorrection::Packet; |
| second_received_packet->is_fec = true; |
| @@ -202,14 +206,12 @@ int32_t FecReceiverImpl::AddReceivedRedPacket( |
| } |
| if (received_packet->pkt->length == 0) { |
| - delete second_received_packet; |
| - delete received_packet; |
| return 0; |
| } |
| - received_packet_list_.push_back(received_packet); |
| + received_packet_list_.push_back(received_packet.release()); |
| if (second_received_packet) { |
| - received_packet_list_.push_back(second_received_packet); |
| + received_packet_list_.push_back(second_received_packet.release()); |
| } |
| return 0; |
| } |