Add range checks in a variety of places where the values will subsequently be
expected to be 0-127.

BUG=none
TEST=none
R=juberti@webrtc.org
TBR=henrika

Review URL: https://webrtc-codereview.appspot.com/37759004

Cr-Commit-Position: refs/heads/master@{#8399}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8399 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/app/webrtc/webrtcsdp.cc b/talk/app/webrtc/webrtcsdp.cc
index eeb6a32..de45c09 100644
--- a/talk/app/webrtc/webrtcsdp.cc
+++ b/talk/app/webrtc/webrtcsdp.cc
@@ -39,6 +39,7 @@
 #include "talk/media/base/codec.h"
 #include "talk/media/base/constants.h"
 #include "talk/media/base/cryptoparams.h"
+#include "talk/media/base/rtputils.h"
 #include "talk/media/sctp/sctpdataengine.h"
 #include "webrtc/p2p/base/candidate.h"
 #include "webrtc/p2p/base/constants.h"
@@ -587,6 +588,14 @@
   return true;
 }
 
+static bool GetPayloadTypeFromString(const std::string& line,
+                                     const std::string& s,
+                                     int* payload_type,
+                                     SdpParseError* error) {
+  return GetValueFromString(line, s, payload_type, error) &&
+      cricket::IsValidRtpPayloadType(*payload_type);
+}
+
 void CreateTracksFromSsrcInfos(const SsrcInfoVec& ssrc_infos,
                                StreamParamsVec* tracks) {
   ASSERT(tracks != NULL);
@@ -2206,7 +2215,7 @@
         }
 
         int pl = 0;
-        if (!GetValueFromString(line, fields[j], &pl, error)) {
+        if (!GetPayloadTypeFromString(line, fields[j], &pl, error)) {
           return false;
         }
         codec_preference.push_back(pl);
@@ -2923,7 +2932,8 @@
     return false;
   }
   int payload_type = 0;
-  if (!GetValueFromString(line, payload_type_value, &payload_type, error)) {
+  if (!GetPayloadTypeFromString(line, payload_type_value, &payload_type,
+                                error)) {
     return false;
   }
 
@@ -3061,7 +3071,7 @@
   }
 
   int int_payload_type = 0;
-  if (!GetValueFromString(line, payload_type, &int_payload_type, error)) {
+  if (!GetPayloadTypeFromString(line, payload_type, &int_payload_type, error)) {
     return false;
   }
   if (media_type == cricket::MEDIA_TYPE_AUDIO) {
@@ -3093,7 +3103,8 @@
   }
   int payload_type = kWildcardPayloadType;
   if (payload_type_string != "*") {
-    if (!GetValueFromString(line, payload_type_string, &payload_type, error)) {
+    if (!GetPayloadTypeFromString(line, payload_type_string, &payload_type,
+                                  error)) {
       return false;
     }
   }
diff --git a/talk/media/base/rtputils.cc b/talk/media/base/rtputils.cc
index aaa76c0..7252cad 100644
--- a/talk/media/base/rtputils.cc
+++ b/talk/media/base/rtputils.cc
@@ -176,7 +176,8 @@
 
 // Assumes version 2, no padding, no extensions, no csrcs.
 bool SetRtpHeader(void* data, size_t len, const RtpHeader& header) {
-  if (header.payload_type >= 0x7F) {
+  if (!IsValidRtpPayloadType(header.payload_type) ||
+      header.seq_num < 0 || header.seq_num > UINT16_MAX) {
     return false;
   }
   return (SetUint8(data, kRtpFlagsOffset, kRtpVersion << 6) &&
@@ -194,4 +195,8 @@
   return (static_cast<const uint8*>(data)[0] >> 6) == kRtpVersion;
 }
 
+bool IsValidRtpPayloadType(int payload_type) {
+  return payload_type >= 0 && payload_type <= 127;
+}
+
 }  // namespace cricket
diff --git a/talk/media/base/rtputils.h b/talk/media/base/rtputils.h
index fa055fa..d6e1b4d 100644
--- a/talk/media/base/rtputils.h
+++ b/talk/media/base/rtputils.h
@@ -67,6 +67,10 @@
 bool SetRtpHeader(void* data, size_t len, const RtpHeader& header);
 
 bool IsRtpPacket(const void* data, size_t len);
+
+// True if |payload type| is 0-127.
+bool IsValidRtpPayloadType(int payload_type);
+
 }  // namespace cricket
 
 #endif  // TALK_MEDIA_BASE_RTPUTILS_H_
diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc
index ed5a626..78246dc 100644
--- a/talk/media/webrtc/webrtcvideoengine.cc
+++ b/talk/media/webrtc/webrtcvideoengine.cc
@@ -1772,6 +1772,8 @@
         receive_codecs_.push_back(wcodec);
         int apt;
         if (iter->GetParam(cricket::kCodecParamAssociatedPayloadType, &apt)) {
+          if (!IsValidRtpPayloadType(apt))
+            return false;
           associated_payload_types_[wcodec.plType] = apt;
         }
       }
@@ -1808,6 +1810,8 @@
       int rtx_type = iter->id;
       int rtx_primary_type = -1;
       if (iter->GetParam(kCodecParamAssociatedPayloadType, &rtx_primary_type)) {
+        if (!IsValidRtpPayloadType(rtx_primary_type))
+          return false;
         primary_rtx_pt_mapping[rtx_primary_type] = rtx_type;
       }
     } else if (engine()->CanSendCodec(*iter, dummy_current, &checked_codec)) {
diff --git a/talk/media/webrtc/webrtcvideoengine2.cc b/talk/media/webrtc/webrtcvideoengine2.cc
index cb025f2..567a719 100644
--- a/talk/media/webrtc/webrtcvideoengine2.cc
+++ b/talk/media/webrtc/webrtcvideoengine2.cc
@@ -2105,9 +2105,11 @@
       case VideoCodec::CODEC_RTX: {
         int associated_payload_type;
         if (!in_codec.GetParam(kCodecParamAssociatedPayloadType,
-                               &associated_payload_type)) {
-          LOG(LS_ERROR) << "RTX codec without associated payload type: "
-                        << in_codec.ToString();
+                               &associated_payload_type) ||
+            !IsValidRtpPayloadType(associated_payload_type)) {
+          LOG(LS_ERROR)
+              << "RTX codec with invalid or no associated payload type: "
+              << in_codec.ToString();
           return std::vector<VideoCodecSettings>();
         }
         rtx_mapping[associated_payload_type] = in_codec.id;
diff --git a/webrtc/voice_engine/test/win_test/WinTestDlg.cc b/webrtc/voice_engine/test/win_test/WinTestDlg.cc
index b63b1d2..ea87a0d 100644
--- a/webrtc/voice_engine/test/win_test/WinTestDlg.cc
+++ b/webrtc/voice_engine/test/win_test/WinTestDlg.cc
@@ -927,7 +927,7 @@
 {
     BOOL ret;
     int pt = GetDlgItemInt(IDC_EDIT_EVENT_RX_PT, &ret);
-    if (ret == FALSE)
+    if (ret == FALSE || pt < 0 || pt > 127)
         return;
     CodecInst codec;
     strcpy_s(codec.plname, 32, "telephone-event");
@@ -940,7 +940,7 @@
 {
     BOOL ret;
     int pt = GetDlgItemInt(IDC_EDIT_EVENT_TX_PT, &ret);
-    if (ret == FALSE)
+    if (ret == FALSE || pt < 0 || pt > 127)
         return;
     TEST2(_veDTMFPtr->SetSendTelephoneEventPayloadType(_channel, pt) == 0,
         _T("SetSendTelephoneEventPayloadType(channel=%d, type=%u)"), _channel, pt);