blob: b0da8033f1f780e3d3027a35ee8d091e96bcec01 [file] [log] [blame]
brandtre405d9b2016-10-18 01:18:04 -07001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <algorithm>
12
Henrik Kjellandera80c16a2017-07-01 16:48:15 +020013#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020014#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
brandtre405d9b2016-10-18 01:18:04 -070015#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
brandtrb29e6522016-12-21 06:37:18 -080016#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020017#include "webrtc/rtc_base/basictypes.h"
brandtre405d9b2016-10-18 01:18:04 -070018
19namespace webrtc {
20
21namespace {
22class DummyCallback : public RecoveredPacketReceiver {
nissed2ef3142017-05-11 08:00:58 -070023 void OnRecoveredPacket(const uint8_t* packet, size_t length) override {}
brandtre405d9b2016-10-18 01:18:04 -070024};
25} // namespace
26
27void FuzzOneInput(const uint8_t* data, size_t size) {
28 constexpr size_t kMinDataNeeded = 12;
29 if (size < kMinDataNeeded) {
30 return;
31 }
32
33 uint32_t flexfec_ssrc;
34 memcpy(&flexfec_ssrc, data + 0, 4);
35 uint16_t flexfec_seq_num;
36 memcpy(&flexfec_seq_num, data + 4, 2);
37 uint32_t media_ssrc;
38 memcpy(&media_ssrc, data + 6, 4);
39 uint16_t media_seq_num;
40 memcpy(&media_seq_num, data + 10, 2);
41
42 DummyCallback callback;
brandtr0a4c1612016-11-03 08:18:27 -070043 FlexfecReceiver receiver(flexfec_ssrc, media_ssrc, &callback);
brandtre405d9b2016-10-18 01:18:04 -070044
45 std::unique_ptr<uint8_t[]> packet;
46 size_t packet_length;
47 size_t i = kMinDataNeeded;
48 while (i < size) {
49 packet_length = kRtpHeaderSize + data[i++];
50 packet = std::unique_ptr<uint8_t[]>(new uint8_t[packet_length]);
51 if (i + packet_length >= size) {
52 break;
53 }
54 memcpy(packet.get(), data + i, packet_length);
55 i += packet_length;
56 if (i < size && data[i++] % 2 == 0) {
57 // Simulate FlexFEC packet.
58 ByteWriter<uint16_t>::WriteBigEndian(packet.get() + 2, flexfec_seq_num++);
59 ByteWriter<uint32_t>::WriteBigEndian(packet.get() + 8, flexfec_ssrc);
60 } else {
61 // Simulate media packet.
62 ByteWriter<uint16_t>::WriteBigEndian(packet.get() + 2, media_seq_num++);
63 ByteWriter<uint32_t>::WriteBigEndian(packet.get() + 8, media_ssrc);
64 }
brandtrb29e6522016-12-21 06:37:18 -080065 RtpPacketReceived parsed_packet;
66 if (parsed_packet.Parse(packet.get(), packet_length)) {
nisse5c29a7a2017-02-16 06:52:32 -080067 receiver.OnRtpPacket(parsed_packet);
brandtrb29e6522016-12-21 06:37:18 -080068 }
brandtre405d9b2016-10-18 01:18:04 -070069 }
70}
71
72} // namespace webrtc