Bug 1325173 - read full RtpStreamId when parsing RTP header extensions. r?drno draft
authorNico Grunbaum
Sun, 05 Mar 2017 23:37:51 -0800
changeset 493861 35356a7ec2b17b2017a439a71bb3a0cb77c5299c
parent 493860 ee6ba4fcb76f65197aac3a7c329cd5942686e8a1
child 547952 a2c0c4f9e6961936ceae89581c2d27ff54ece231
push id47869
push userna-g@nostrum.com
push dateMon, 06 Mar 2017 07:38:33 +0000
reviewersdrno
bugs1325173
milestone54.0a1
Bug 1325173 - read full RtpStreamId when parsing RTP header extensions. r?drno MozReview-Commit-ID: CHkqA0MM3fx
media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
--- a/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
+++ b/media/webrtc/trunk/webrtc/modules/rtp_rtcp/source/rtp_utility.cc
@@ -425,20 +425,30 @@ void RtpHeaderParser::ParseOneByteExtens
         }
         case kRtpExtensionRtpStreamId: {
           //   0                   1                   2
           //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
           //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
           //  |  ID   | L=?   |UTF-8 RID value......          |...
           //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-          // TODO(jesup) - avoid allocating on each packet - high watermark the RID buffer?
-          char* ptrRID = new char[len+1];
-          memcpy(ptrRID, ptr, len);
-          ptrRID[len] = '\0';
+          // As per RFC 5285 section 4.2, len is the length of the header data
+          // - 1. E.G. a len of 0 indicates a header data length of 1
+          if ( &ptr[len + 1] > ptrRTPDataExtensionEnd ) {
+            LOG(LS_WARNING) << "Extension RtpStreamId data length " << (len + 1)
+              << " is longer than remaining input parse buffer "
+              << static_cast<size_t>(ptrRTPDataExtensionEnd - ptr);
+            return;
+          }
+
+          // TODO(jesup) - avoid allocating on each packet - high watermark the
+          // RID buffer?
+          char* ptrRID = new char[len + 2];
+          memcpy(ptrRID, ptr, len + 1);
+          ptrRID[len + 1] = '\0';
           header->extension.rid = ptrRID;
           header->extension.hasRID = true;
           break;
         }
         default: {
           LOG(LS_WARNING) << "Extension type not implemented: " << type;
           return;
         }