1 /*
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 "modules/rtp_rtcp/include/rtp_header_extension_map.h"
12 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
13 #include "modules/rtp_rtcp/source/rtp_packet_received.h"
14 
15 namespace webrtc {
16 
17 // We decide which header extensions to register by reading two bytes
18 // from the beginning of |data| and interpreting it as a bitmask over
19 // the RTPExtensionType enum. This assert ensures two bytes are enough.
20 static_assert(kRtpExtensionNumberOfExtensions <= 16,
21               "Insufficient bits read to configure all header extensions. Add "
22               "an extra byte and update the switches.");
23 
FuzzOneInput(const uint8_t * data,size_t size)24 void FuzzOneInput(const uint8_t* data, size_t size) {
25   if (size <= 2)
26     return;
27 
28   // Don't use the configuration bytes as part of the packet.
29   std::bitset<16> extensionMask(*reinterpret_cast<const uint16_t*>(data));
30   data += 2;
31   size -= 2;
32 
33   RtpPacketReceived::ExtensionManager extensions;
34   // Skip i = 0 since it maps to ExtensionNone and extension id = 0 is invalid.
35   for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) {
36     RTPExtensionType extension_type = static_cast<RTPExtensionType>(i);
37     if (extensionMask[i] && extension_type != kRtpExtensionNone) {
38       // Extensions are registered with an ID, which you signal to the
39       // peer so they know what to expect. This code only cares about
40       // parsing so the value of the ID isn't relevant; we use i.
41       extensions.RegisterByType(i, extension_type);
42     }
43   }
44 
45   RtpPacketReceived packet(&extensions);
46   packet.Parse(data, size);
47 
48   // Call packet accessors because they have extra checks.
49   packet.Marker();
50   packet.PayloadType();
51   packet.SequenceNumber();
52   packet.Timestamp();
53   packet.Ssrc();
54   packet.Csrcs();
55 
56   // Each extension has its own getter. It is supported behaviour to
57   // call GetExtension on an extension which was not registered, so we
58   // don't check the bitmask here.
59   for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) {
60     switch (static_cast<RTPExtensionType>(i)) {
61       case kRtpExtensionNone:
62       case kRtpExtensionNumberOfExtensions:
63         break;
64       case kRtpExtensionTransmissionTimeOffset:
65         int32_t offset;
66         packet.GetExtension<TransmissionOffset>(&offset);
67         break;
68       case kRtpExtensionAudioLevel:
69         bool voice_activity;
70         uint8_t audio_level;
71         packet.GetExtension<AudioLevel>(&voice_activity, &audio_level);
72         break;
73       case kRtpExtensionAbsoluteSendTime:
74         uint32_t sendtime;
75         packet.GetExtension<AbsoluteSendTime>(&sendtime);
76         break;
77       case kRtpExtensionVideoRotation:
78         uint8_t rotation;
79         packet.GetExtension<VideoOrientation>(&rotation);
80         break;
81       case kRtpExtensionTransportSequenceNumber:
82         uint16_t seqnum;
83         packet.GetExtension<TransportSequenceNumber>(&seqnum);
84         break;
85       case kRtpExtensionPlayoutDelay:
86         PlayoutDelay playout;
87         packet.GetExtension<PlayoutDelayLimits>(&playout);
88         break;
89       case kRtpExtensionVideoContentType:
90         VideoContentType content_type;
91         packet.GetExtension<VideoContentTypeExtension>(&content_type);
92         break;
93       case kRtpExtensionVideoTiming:
94         VideoSendTiming timing;
95         packet.GetExtension<VideoTimingExtension>(&timing);
96         break;
97       case kRtpExtensionRtpStreamId: {
98         std::string rsid;
99         packet.GetExtension<RtpStreamId>(&rsid);
100         break;
101       }
102       case kRtpExtensionRepairedRtpStreamId: {
103         std::string rsid;
104         packet.GetExtension<RepairedRtpStreamId>(&rsid);
105         break;
106       }
107       case kRtpExtensionMid: {
108         std::string mid;
109         packet.GetExtension<RtpMid>(&mid);
110         break;
111       }
112       case kRtpExtensionCsrcAudioLevel: {
113         CsrcAudioLevelList levels;
114         packet.GetExtension<CsrcAudioLevel>(&levels);
115         break;
116       }
117     }
118   }
119 }
120 }  // namespace webrtc
121