Chromium Code Reviews| Index: webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc |
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc |
| index ba41c620c52f81d2896e76d86e64959442250449..073a67b46977a430d6291b12089bb46f3594b310 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_format_h264.cc |
| @@ -40,6 +40,22 @@ enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F }; |
| // Bit masks for FU (A and B) headers. |
| enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 }; |
| +bool VerifyStapANaluLengths(const uint8_t* nalu_ptr, size_t length_remaining) { |
| + while (length_remaining > 0) { |
|
stefan-webrtc
2015/07/28 14:22:18
Add a TODO to not parse this twice (here and in th
|
| + // Buffer doesn't contain room for additional nalu length. |
| + if (length_remaining < sizeof(uint16_t)) |
| + return false; |
| + uint16_t nalu_size = nalu_ptr[0] << 8 | nalu_ptr[1]; |
| + nalu_ptr += sizeof(uint16_t); |
| + length_remaining -= sizeof(uint16_t); |
| + if (nalu_size > length_remaining) |
| + return false; |
| + nalu_ptr += nalu_size; |
| + length_remaining -= nalu_size; |
| + } |
| + return true; |
| +} |
| + |
| bool ParseSingleNalu(RtpDepacketizer::ParsedPayload* parsed_payload, |
| const uint8_t* payload_data, |
| size_t payload_data_length) { |
| @@ -59,6 +75,9 @@ bool ParseSingleNalu(RtpDepacketizer::ParsedPayload* parsed_payload, |
| LOG(LS_ERROR) << "StapA header truncated."; |
| return false; |
| } |
| + if (!VerifyStapANaluLengths(nalu_start, nalu_length)) |
|
stefan-webrtc
2015/07/28 14:22:19
Log this?
|
| + return false; |
| + |
| nal_type = payload_data[kStapAHeaderSize] & kTypeMask; |
| nalu_start += kStapAHeaderSize; |
| nalu_length -= kStapAHeaderSize; |