1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #include <algorithm> 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" 14*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/byte_io.h" 15*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_packet_received.h" 16*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/ulpfec_receiver.h" 17*d9f75844SAndroid Build Coastguard Worker #include "test/fuzzers/fuzz_data_helper.h" 18*d9f75844SAndroid Build Coastguard Worker 19*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker namespace { 22*d9f75844SAndroid Build Coastguard Worker class DummyCallback : public RecoveredPacketReceiver { OnRecoveredPacket(const uint8_t * packet,size_t length)23*d9f75844SAndroid Build Coastguard Worker void OnRecoveredPacket(const uint8_t* packet, size_t length) override {} 24*d9f75844SAndroid Build Coastguard Worker }; 25*d9f75844SAndroid Build Coastguard Worker } // namespace 26*d9f75844SAndroid Build Coastguard Worker FuzzOneInput(const uint8_t * data,size_t size)27*d9f75844SAndroid Build Coastguard Workervoid FuzzOneInput(const uint8_t* data, size_t size) { 28*d9f75844SAndroid Build Coastguard Worker constexpr size_t kMinDataNeeded = 12; 29*d9f75844SAndroid Build Coastguard Worker if (size < kMinDataNeeded || size > 2000) { 30*d9f75844SAndroid Build Coastguard Worker return; 31*d9f75844SAndroid Build Coastguard Worker } 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker uint32_t ulpfec_ssrc = ByteReader<uint32_t>::ReadLittleEndian(data + 0); 34*d9f75844SAndroid Build Coastguard Worker uint16_t ulpfec_seq_num = ByteReader<uint16_t>::ReadLittleEndian(data + 4); 35*d9f75844SAndroid Build Coastguard Worker uint32_t media_ssrc = ByteReader<uint32_t>::ReadLittleEndian(data + 6); 36*d9f75844SAndroid Build Coastguard Worker uint16_t media_seq_num = ByteReader<uint16_t>::ReadLittleEndian(data + 10); 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Worker DummyCallback callback; 39*d9f75844SAndroid Build Coastguard Worker UlpfecReceiver receiver(ulpfec_ssrc, 0, &callback, {}, 40*d9f75844SAndroid Build Coastguard Worker Clock::GetRealTimeClock()); 41*d9f75844SAndroid Build Coastguard Worker 42*d9f75844SAndroid Build Coastguard Worker test::FuzzDataHelper fuzz_data(rtc::MakeArrayView(data, size)); 43*d9f75844SAndroid Build Coastguard Worker while (fuzz_data.CanReadBytes(kMinDataNeeded)) { 44*d9f75844SAndroid Build Coastguard Worker size_t packet_length = kRtpHeaderSize + fuzz_data.Read<uint8_t>(); 45*d9f75844SAndroid Build Coastguard Worker auto raw_packet = fuzz_data.ReadByteArray(packet_length); 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker RtpPacketReceived parsed_packet; 48*d9f75844SAndroid Build Coastguard Worker if (!parsed_packet.Parse(raw_packet)) 49*d9f75844SAndroid Build Coastguard Worker continue; 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Worker // Overwrite the fields for the sequence number and SSRC with 52*d9f75844SAndroid Build Coastguard Worker // consistent values for either a received UlpFEC packet or received media 53*d9f75844SAndroid Build Coastguard Worker // packet. (We're still relying on libfuzzer to manage to generate packet 54*d9f75844SAndroid Build Coastguard Worker // headers that interact together; this just ensures that we have two 55*d9f75844SAndroid Build Coastguard Worker // consistent streams). 56*d9f75844SAndroid Build Coastguard Worker if (fuzz_data.ReadOrDefaultValue<uint8_t>(0) % 2 == 0) { 57*d9f75844SAndroid Build Coastguard Worker // Simulate UlpFEC packet. 58*d9f75844SAndroid Build Coastguard Worker parsed_packet.SetSequenceNumber(ulpfec_seq_num++); 59*d9f75844SAndroid Build Coastguard Worker parsed_packet.SetSsrc(ulpfec_ssrc); 60*d9f75844SAndroid Build Coastguard Worker } else { 61*d9f75844SAndroid Build Coastguard Worker // Simulate media packet. 62*d9f75844SAndroid Build Coastguard Worker parsed_packet.SetSequenceNumber(media_seq_num++); 63*d9f75844SAndroid Build Coastguard Worker parsed_packet.SetSsrc(media_ssrc); 64*d9f75844SAndroid Build Coastguard Worker } 65*d9f75844SAndroid Build Coastguard Worker 66*d9f75844SAndroid Build Coastguard Worker receiver.AddReceivedRedPacket(parsed_packet); 67*d9f75844SAndroid Build Coastguard Worker } 68*d9f75844SAndroid Build Coastguard Worker 69*d9f75844SAndroid Build Coastguard Worker receiver.ProcessReceivedFec(); 70*d9f75844SAndroid Build Coastguard Worker } 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 73