Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | |
| 10 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
| 12 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | |
| 13 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | |
| 11 | 14 |
| 12 namespace webrtc { | 15 namespace webrtc { |
| 16 void FuzzOneInput(const uint8_t* data, size_t size) { | |
| 17 if (size <= 1) | |
| 18 return; | |
| 13 | 19 |
| 14 void FuzzOneInput(const uint8_t* data, size_t size) { | 20 // We decide which header extensions to register by reading one byte |
|
danilchap
2016/06/27 11:06:17
The way parsing is written, registering all extens
katrielc
2016/07/04 07:15:31
What about an out-of-bounds read that reads too fa
danilchap
2016/07/04 08:43:55
I'm not sure how not registering extension can hel
| |
| 15 RtpPacketReceived packet; | 21 // from the beginning of |data| and interpreting it as a bitmask |
| 22 // over the RTPExtensionType enum. That byte shouldn't also be part | |
| 23 // of the packet, so we adjust |data| and |size| to remove it. | |
| 24 std::bitset<8> extensionMask(data[0]); | |
| 25 data++; | |
| 26 size--; | |
| 16 | 27 |
| 28 RtpPacketReceived::ExtensionManager extensions; | |
|
pbos-webrtc
2016/06/26 21:49:59
Make a compile-time assert on kRtpExtensionNumberO
katrielc
2016/07/04 07:15:31
Done.
| |
| 29 for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) { | |
| 30 // Skip i=0 which is kRtpExtensionNone i.e. not an actual extension. | |
|
pbos-webrtc
2016/06/26 21:49:59
From zero, but skip if it's kRtpExtensionNone expl
katrielc
2016/07/04 07:15:31
Done.
| |
| 31 if (extensionMask[i]) { | |
| 32 // We use i as the ID; it's used in negotiation so not relevant. | |
| 33 extensions.Register(static_cast<RTPExtensionType>(i), i); | |
| 34 } | |
| 35 } | |
| 36 | |
| 37 RtpPacketReceived packet(&extensions); | |
| 17 packet.Parse(data, size); | 38 packet.Parse(data, size); |
| 18 | 39 |
| 19 // Call packet accessors because they have extra checks. | 40 // Call packet accessors because they have extra checks. |
| 20 packet.Marker(); | 41 packet.Marker(); |
| 21 packet.PayloadType(); | 42 packet.PayloadType(); |
| 22 packet.SequenceNumber(); | 43 packet.SequenceNumber(); |
| 23 packet.Timestamp(); | 44 packet.Timestamp(); |
| 24 packet.Ssrc(); | 45 packet.Ssrc(); |
| 25 packet.Csrcs(); | 46 packet.Csrcs(); |
| 47 | |
| 48 // Each extension has its own getter. Call all the ones we registered above. | |
|
pbos-webrtc
2016/06/26 21:49:59
Should this have defined behavior on non-registere
danilchap
2016/06/27 11:06:17
Yes. both for non-registered and non-present exten
katrielc
2016/07/04 07:15:31
Acknowledged.
| |
| 49 for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) { | |
| 50 if (extensionMask[i]) { | |
| 51 switch (i) { | |
|
pbos-webrtc
2016/06/26 21:49:59
cast to RTPExtensionType here instead of to int be
katrielc
2016/07/04 07:15:31
Done.
| |
| 52 case (int)kRtpExtensionTransmissionTimeOffset: | |
| 53 int32_t offset; | |
| 54 packet.GetExtension<TransmissionOffset>(&offset); | |
| 55 break; | |
| 56 case (int)kRtpExtensionAudioLevel: | |
| 57 bool voice_activity; | |
| 58 uint8_t audio_level; | |
| 59 packet.GetExtension<AudioLevel>(&voice_activity, &audio_level); | |
| 60 break; | |
| 61 case (int)kRtpExtensionAbsoluteSendTime: | |
| 62 uint32_t sendtime; | |
| 63 packet.GetExtension<AbsoluteSendTime>(&sendtime); | |
| 64 break; | |
| 65 case (int)kRtpExtensionVideoRotation: | |
| 66 uint8_t rotation; | |
| 67 packet.GetExtension<VideoOrientation>(&rotation); | |
| 68 break; | |
| 69 case (int)kRtpExtensionTransportSequenceNumber: | |
| 70 uint16_t seqnum; | |
| 71 packet.GetExtension<TransportSequenceNumber>(&seqnum); | |
| 72 break; | |
| 73 case (int)kRtpExtensionPlayoutDelay: | |
| 74 // TODO(danilchap) Add this once it's written. | |
|
pbos-webrtc
2016/06/26 21:49:59
TODO(katrielc):
katrielc
2016/07/04 07:15:31
Done, though I'm leaving in two weeks...
danilchap
2016/07/04 08:43:55
That doesn't matter here: TODO name the person who
| |
| 75 break; | |
| 76 default: | |
| 77 break; | |
|
pbos-webrtc
2016/06/26 21:49:59
Remove default, or assert false on it.
katrielc
2016/07/04 07:15:31
Done.
| |
| 78 } | |
| 79 } | |
| 80 } | |
| 26 } | 81 } |
| 27 | |
| 28 } // namespace webrtc | 82 } // namespace webrtc |
| 29 | |
| OLD | NEW |