blob: 774be0871e58516e2061df9a1074dfe528256547 [file] [log] [blame]
danilchap1edb7ab2016-04-20 12:25:101/*
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 */
katrielc36a321d2016-07-05 14:20:2410
Jonas Olsson941a07c2018-09-13 08:07:0711#include <bitset>
12
Johannes Kron54047be2019-02-21 14:09:2013#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3114#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
Danil Chapovalov916ec7d2018-06-25 16:22:1515#include "modules/rtp_rtcp/source/rtp_generic_frame_descriptor_extension.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3116#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
17#include "modules/rtp_rtcp/source/rtp_packet_received.h"
danilchap1edb7ab2016-04-20 12:25:1018
19namespace webrtc {
Johannes Krond6c6f162019-02-21 08:33:1420// We decide which header extensions to register by reading four bytes
katrielc36a321d2016-07-05 14:20:2421// from the beginning of |data| and interpreting it as a bitmask over
Johannes Krond6c6f162019-02-21 08:33:1422// the RTPExtensionType enum. This assert ensures four bytes are enough.
23static_assert(kRtpExtensionNumberOfExtensions <= 32,
katrielc36a321d2016-07-05 14:20:2424 "Insufficient bits read to configure all header extensions. Add "
25 "an extra byte and update the switches.");
danilchap1edb7ab2016-04-20 12:25:1026
katrielc36a321d2016-07-05 14:20:2427void FuzzOneInput(const uint8_t* data, size_t size) {
Johannes Krond6c6f162019-02-21 08:33:1428 if (size <= 4)
katrielc36a321d2016-07-05 14:20:2429 return;
30
Johannes Krond6c6f162019-02-21 08:33:1431 // Don't use the configuration byte as part of the packet.
32 std::bitset<32> extensionMask(*reinterpret_cast<const uint32_t*>(data));
33 data += 4;
34 size -= 4;
katrielc36a321d2016-07-05 14:20:2435
Johannes Krond6c6f162019-02-21 08:33:1436 RtpPacketReceived::ExtensionManager extensions(/*extmap_allow_mixed=*/true);
37 // Start at local_id = 1 since 0 is an invalid extension id.
38 int local_id = 1;
39 // Skip i = 0 since it maps to kRtpExtensionNone.
danilchapef8d7732017-04-19 09:59:4840 for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) {
katrielc36a321d2016-07-05 14:20:2441 RTPExtensionType extension_type = static_cast<RTPExtensionType>(i);
Johannes Krond6c6f162019-02-21 08:33:1442 if (extensionMask[i]) {
katrielc36a321d2016-07-05 14:20:2443 // Extensions are registered with an ID, which you signal to the
44 // peer so they know what to expect. This code only cares about
Johannes Krond6c6f162019-02-21 08:33:1445 // parsing so the value of the ID isn't relevant.
46 extensions.RegisterByType(local_id++, extension_type);
katrielc36a321d2016-07-05 14:20:2447 }
48 }
49
50 RtpPacketReceived packet(&extensions);
danilchap1edb7ab2016-04-20 12:25:1051 packet.Parse(data, size);
52
53 // Call packet accessors because they have extra checks.
54 packet.Marker();
55 packet.PayloadType();
56 packet.SequenceNumber();
57 packet.Timestamp();
58 packet.Ssrc();
59 packet.Csrcs();
katrielc36a321d2016-07-05 14:20:2460
61 // Each extension has its own getter. It is supported behaviour to
62 // call GetExtension on an extension which was not registered, so we
63 // don't check the bitmask here.
64 for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) {
65 switch (static_cast<RTPExtensionType>(i)) {
66 case kRtpExtensionNone:
67 case kRtpExtensionNumberOfExtensions:
68 break;
69 case kRtpExtensionTransmissionTimeOffset:
70 int32_t offset;
71 packet.GetExtension<TransmissionOffset>(&offset);
72 break;
73 case kRtpExtensionAudioLevel:
74 bool voice_activity;
75 uint8_t audio_level;
76 packet.GetExtension<AudioLevel>(&voice_activity, &audio_level);
77 break;
78 case kRtpExtensionAbsoluteSendTime:
79 uint32_t sendtime;
80 packet.GetExtension<AbsoluteSendTime>(&sendtime);
81 break;
Chen Xingcd8a6e22019-07-01 08:56:5182 case kRtpExtensionAbsoluteCaptureTime: {
83 AbsoluteCaptureTime extension;
84 packet.GetExtension<AbsoluteCaptureTimeExtension>(&extension);
85 break;
86 }
katrielc36a321d2016-07-05 14:20:2487 case kRtpExtensionVideoRotation:
88 uint8_t rotation;
89 packet.GetExtension<VideoOrientation>(&rotation);
90 break;
91 case kRtpExtensionTransportSequenceNumber:
92 uint16_t seqnum;
93 packet.GetExtension<TransportSequenceNumber>(&seqnum);
94 break;
Johannes Kron54047be2019-02-21 14:09:2095 case kRtpExtensionTransportSequenceNumber02: {
96 uint16_t seqnum;
97 absl::optional<FeedbackRequest> feedback_request;
98 packet.GetExtension<TransportSequenceNumberV2>(&seqnum,
99 &feedback_request);
100 break;
101 }
Erik Språng56e611b2020-02-06 16:10:08102 case kRtpExtensionPlayoutDelay: {
103 PlayoutDelay playout = PlayoutDelay::Noop();
Danil Chapovalov08b03512016-09-07 13:08:13104 packet.GetExtension<PlayoutDelayLimits>(&playout);
katrielc36a321d2016-07-05 14:20:24105 break;
Erik Språng56e611b2020-02-06 16:10:08106 }
ilnik00d802b2017-04-11 17:34:31107 case kRtpExtensionVideoContentType:
108 VideoContentType content_type;
109 packet.GetExtension<VideoContentTypeExtension>(&content_type);
110 break;
ilnik04f4d122017-06-19 14:18:55111 case kRtpExtensionVideoTiming:
ilnik2edc6842017-07-06 10:06:50112 VideoSendTiming timing;
ilnik04f4d122017-06-19 14:18:55113 packet.GetExtension<VideoTimingExtension>(&timing);
114 break;
Johnny Leee0c8b232018-09-11 20:50:49115 case kRtpExtensionFrameMarking:
116 FrameMarking frame_marking;
117 packet.GetExtension<FrameMarkingExtension>(&frame_marking);
118 break;
danilchapef8d7732017-04-19 09:59:48119 case kRtpExtensionRtpStreamId: {
120 std::string rsid;
121 packet.GetExtension<RtpStreamId>(&rsid);
122 break;
123 }
124 case kRtpExtensionRepairedRtpStreamId: {
125 std::string rsid;
126 packet.GetExtension<RepairedRtpStreamId>(&rsid);
127 break;
128 }
Steve Antona3251dd2017-07-21 16:58:31129 case kRtpExtensionMid: {
130 std::string mid;
131 packet.GetExtension<RtpMid>(&mid);
132 break;
133 }
Elad Alonccb9b752019-02-19 12:01:31134 case kRtpExtensionGenericFrameDescriptor00: {
Danil Chapovalov916ec7d2018-06-25 16:22:15135 RtpGenericFrameDescriptor descriptor;
Elad Alonccb9b752019-02-19 12:01:31136 packet.GetExtension<RtpGenericFrameDescriptorExtension00>(&descriptor);
137 break;
138 }
139 case kRtpExtensionGenericFrameDescriptor01: {
140 RtpGenericFrameDescriptor descriptor;
141 packet.GetExtension<RtpGenericFrameDescriptorExtension01>(&descriptor);
Danil Chapovalov916ec7d2018-06-25 16:22:15142 break;
143 }
Johannes Kron09d65882018-11-27 13:36:41144 case kRtpExtensionColorSpace: {
145 ColorSpace color_space;
146 packet.GetExtension<ColorSpaceExtension>(&color_space);
Johannes Kronad1d9f02018-11-09 10:12:36147 break;
148 }
Minyue Licae27792019-11-29 15:18:59149 case kRtpExtensionInbandComfortNoise: {
150 absl::optional<uint8_t> noise_level;
151 packet.GetExtension<InbandComfortNoiseExtension>(&noise_level);
152 break;
153 }
Danil Chapovalov52e52422019-06-27 14:45:40154 case kRtpExtensionGenericFrameDescriptor02:
155 // This extension requires state to read and so complicated that
156 // deserves own fuzzer.
157 break;
katrielc36a321d2016-07-05 14:20:24158 }
159 }
Ilya Nikolaevskiydb6ca7f2020-01-17 13:15:27160
161 // Check that zero-ing mutable extensions wouldn't cause any problems.
162 packet.ZeroMutableExtensions();
danilchap1edb7ab2016-04-20 12:25:10163}
danilchap1edb7ab2016-04-20 12:25:10164} // namespace webrtc