Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(544)

Side by Side Diff: webrtc/pc/webrtcsdp.cc

Issue 2675273003: Fixing SDP parsing crash due to invalid port numbers. (Closed)
Patch Set: IsValidPort function Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/socketaddress.h ('k') | webrtc/pc/webrtcsdp_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2011 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
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 using cricket::StreamParamsVec; 72 using cricket::StreamParamsVec;
73 using cricket::TransportDescription; 73 using cricket::TransportDescription;
74 using cricket::TransportInfo; 74 using cricket::TransportInfo;
75 using cricket::VideoContentDescription; 75 using cricket::VideoContentDescription;
76 using rtc::SocketAddress; 76 using rtc::SocketAddress;
77 77
78 namespace cricket { 78 namespace cricket {
79 class SessionDescription; 79 class SessionDescription;
80 } 80 }
81 81
82 // TODO(deadbeef): Switch to using anonymous namespace rather than declaring
83 // everything "static".
82 namespace webrtc { 84 namespace webrtc {
83 85
84 // Line type 86 // Line type
85 // RFC 4566 87 // RFC 4566
86 // An SDP session description consists of a number of lines of text of 88 // An SDP session description consists of a number of lines of text of
87 // the form: 89 // the form:
88 // <type>=<value> 90 // <type>=<value>
89 // where <type> MUST be exactly one case-significant character. 91 // where <type> MUST be exactly one case-significant character.
90 static const int kLinePrefixLength = 2; // Length of <type>= 92 static const int kLinePrefixLength = 2; // Length of <type>=
91 static const char kLineTypeVersion = 'v'; 93 static const char kLineTypeVersion = 'v';
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 if (!candidates) { 785 if (!candidates) {
784 return; 786 return;
785 } 787 }
786 const IceCandidateCollection* cc = desci.candidates(mline_index); 788 const IceCandidateCollection* cc = desci.candidates(mline_index);
787 for (size_t i = 0; i < cc->count(); ++i) { 789 for (size_t i = 0; i < cc->count(); ++i) {
788 const IceCandidateInterface* candidate = cc->at(i); 790 const IceCandidateInterface* candidate = cc->at(i);
789 candidates->push_back(candidate->candidate()); 791 candidates->push_back(candidate->candidate());
790 } 792 }
791 } 793 }
792 794
795 static bool IsValidPort(int port) {
796 return port >= 0 && port <= 65535;
797 }
798
793 std::string SdpSerialize(const JsepSessionDescription& jdesc, 799 std::string SdpSerialize(const JsepSessionDescription& jdesc,
794 bool unified_plan_sdp) { 800 bool unified_plan_sdp) {
795 const cricket::SessionDescription* desc = jdesc.description(); 801 const cricket::SessionDescription* desc = jdesc.description();
796 if (!desc) { 802 if (!desc) {
797 return ""; 803 return "";
798 } 804 }
799 805
800 std::string message; 806 std::string message;
801 807
802 // Session Description. 808 // Session Description.
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 const std::string& transport = fields[2]; 1025 const std::string& transport = fields[2];
1020 uint32_t priority = 0; 1026 uint32_t priority = 0;
1021 if (!GetValueFromString(first_line, fields[3], &priority, error)) { 1027 if (!GetValueFromString(first_line, fields[3], &priority, error)) {
1022 return false; 1028 return false;
1023 } 1029 }
1024 const std::string& connection_address = fields[4]; 1030 const std::string& connection_address = fields[4];
1025 int port = 0; 1031 int port = 0;
1026 if (!GetValueFromString(first_line, fields[5], &port, error)) { 1032 if (!GetValueFromString(first_line, fields[5], &port, error)) {
1027 return false; 1033 return false;
1028 } 1034 }
1035 if (!IsValidPort(port)) {
1036 return ParseFailed(first_line, "Invalid port number.", error);
1037 }
1029 SocketAddress address(connection_address, port); 1038 SocketAddress address(connection_address, port);
1030 1039
1031 cricket::ProtocolType protocol; 1040 cricket::ProtocolType protocol;
1032 if (!StringToProto(transport.c_str(), &protocol)) { 1041 if (!StringToProto(transport.c_str(), &protocol)) {
1033 return ParseFailed(first_line, "Unsupported transport type.", error); 1042 return ParseFailed(first_line, "Unsupported transport type.", error);
1034 } 1043 }
1035 switch (protocol) { 1044 switch (protocol) {
1036 case cricket::PROTO_UDP: 1045 case cricket::PROTO_UDP:
1037 case cricket::PROTO_TCP: 1046 case cricket::PROTO_TCP:
1038 case cricket::PROTO_SSLTCP: 1047 case cricket::PROTO_SSLTCP:
(...skipping 26 matching lines...) Expand all
1065 related_address.SetIP(fields[++current_position]); 1074 related_address.SetIP(fields[++current_position]);
1066 ++current_position; 1075 ++current_position;
1067 } 1076 }
1068 if (fields.size() >= (current_position + 2) && 1077 if (fields.size() >= (current_position + 2) &&
1069 fields[current_position] == kAttributeCandidateRport) { 1078 fields[current_position] == kAttributeCandidateRport) {
1070 int port = 0; 1079 int port = 0;
1071 if (!GetValueFromString( 1080 if (!GetValueFromString(
1072 first_line, fields[++current_position], &port, error)) { 1081 first_line, fields[++current_position], &port, error)) {
1073 return false; 1082 return false;
1074 } 1083 }
1084 if (!IsValidPort(port)) {
1085 return ParseFailed(first_line, "Invalid port number.", error);
1086 }
1075 related_address.SetPort(port); 1087 related_address.SetPort(port);
1076 ++current_position; 1088 ++current_position;
1077 } 1089 }
1078 1090
1079 // If this is a TCP candidate, it has additional extension as defined in 1091 // If this is a TCP candidate, it has additional extension as defined in
1080 // RFC 6544. 1092 // RFC 6544.
1081 std::string tcptype; 1093 std::string tcptype;
1082 if (fields.size() >= (current_position + 2) && 1094 if (fields.size() >= (current_position + 2) &&
1083 fields[current_position] == kTcpCandidateType) { 1095 fields[current_position] == kTcpCandidateType) {
1084 tcptype = fields[++current_position]; 1096 tcptype = fields[++current_position];
(...skipping 2106 matching lines...) Expand 10 before | Expand all | Expand 10 after
3191 UpdateCodec<AudioContentDescription, cricket::AudioCodec>( 3203 UpdateCodec<AudioContentDescription, cricket::AudioCodec>(
3192 media_desc, payload_type, feedback_param); 3204 media_desc, payload_type, feedback_param);
3193 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) { 3205 } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
3194 UpdateCodec<VideoContentDescription, cricket::VideoCodec>( 3206 UpdateCodec<VideoContentDescription, cricket::VideoCodec>(
3195 media_desc, payload_type, feedback_param); 3207 media_desc, payload_type, feedback_param);
3196 } 3208 }
3197 return true; 3209 return true;
3198 } 3210 }
3199 3211
3200 } // namespace webrtc 3212 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/base/socketaddress.h ('k') | webrtc/pc/webrtcsdp_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698