Fix a case where empty candidate id is used

BUG=4161
R=juberti@webrtc.org

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

git-svn-id: http://webrtc.googlecode.com/svn/trunk@8071 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
guoweis@webrtc.org 2015-01-15 06:53:07 +00:00
parent 6c3855258d
commit 61c1247224
6 changed files with 57 additions and 56 deletions

View File

@ -100,8 +100,8 @@ class JsepSessionDescriptionTest : public testing::Test {
virtual void SetUp() {
int port = 1234;
rtc::SocketAddress address("127.0.0.1", port++);
cricket::Candidate candidate("rtp", cricket::ICE_CANDIDATE_COMPONENT_RTP,
"udp", address, 1, "", "", "local", 0, "1");
cricket::Candidate candidate(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
address, 1, "", "", "local", 0, "1");
candidate_ = candidate;
const std::string session_id =
rtc::ToString(rtc::CreateRandomId64());

View File

@ -1040,8 +1040,7 @@ TEST_F(StatsCollectorTest, IceCandidateReport) {
uint32 priority = 1000;
cricket::Candidate c;
const std::string& local_id = rtc::CreateRandomString(8);
c.set_id(local_id);
ASSERT(c.id().length() > 0);
c.set_type(cricket::LOCAL_PORT_TYPE);
c.set_protocol(cricket::UDP_PROTOCOL_NAME);
c.set_address(local_address);
@ -1049,15 +1048,18 @@ TEST_F(StatsCollectorTest, IceCandidateReport) {
c.set_network_type(network_type);
std::string report_id = AddCandidateReport(
&stats, c, StatsReport::kStatsReportTypeIceLocalCandidate);
EXPECT_EQ("Cand-" + local_id, report_id);
EXPECT_EQ("Cand-" + c.id(), report_id);
const std::string& remote_id = rtc::CreateRandomString(8);
c.set_id(remote_id);
c = cricket::Candidate();
ASSERT(c.id().length() > 0);
c.set_type(cricket::PRFLX_PORT_TYPE);
c.set_protocol(cricket::UDP_PROTOCOL_NAME);
c.set_address(remote_address);
c.set_priority(priority);
c.set_network_type(network_type);
report_id = AddCandidateReport(
&stats, c, StatsReport::kStatsReportTypeIceRemoteCandidate);
EXPECT_EQ("Cand-" + remote_id, report_id);
EXPECT_EQ("Cand-" + c.id(), report_id);
stats.GetStats(NULL, &reports);

View File

@ -1090,8 +1090,7 @@ bool ParseCandidate(const std::string& message, Candidate* candidate,
}
}
const std::string id;
*candidate = Candidate(id, component_id, cricket::ProtoToString(protocol),
*candidate = Candidate(component_id, cricket::ProtoToString(protocol),
address, priority, username, password, candidate_type,
generation, foundation);
candidate->set_related_address(related_address);

View File

@ -588,41 +588,41 @@ class WebRtcSdpTest : public testing::Test {
// v4 host
int port = 1234;
rtc::SocketAddress address("192.168.1.5", port++);
Candidate candidate1("", ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
Candidate candidate1(ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
kCandidatePriority, "", "", LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation1);
address.SetPort(port++);
Candidate candidate2("", ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
Candidate candidate2(ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
kCandidatePriority, "", "", LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation1);
address.SetPort(port++);
Candidate candidate3("", ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
Candidate candidate3(ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
kCandidatePriority, "", "", LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation1);
address.SetPort(port++);
Candidate candidate4("", ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
Candidate candidate4(ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
kCandidatePriority, "", "", LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation1);
// v6 host
rtc::SocketAddress v6_address("::1", port++);
cricket::Candidate candidate5("", cricket::ICE_CANDIDATE_COMPONENT_RTP,
"udp", v6_address, kCandidatePriority, "", "",
cricket::Candidate candidate5(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
v6_address, kCandidatePriority, "", "",
cricket::LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation2);
v6_address.SetPort(port++);
cricket::Candidate candidate6("", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
"udp", v6_address, kCandidatePriority, "", "",
cricket::Candidate candidate6(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
v6_address, kCandidatePriority, "", "",
cricket::LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation2);
v6_address.SetPort(port++);
cricket::Candidate candidate7("", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
"udp", v6_address, kCandidatePriority, "", "",
cricket::Candidate candidate7(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
v6_address, kCandidatePriority, "", "",
cricket::LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation2);
v6_address.SetPort(port++);
cricket::Candidate candidate8("", cricket::ICE_CANDIDATE_COMPONENT_RTP,
"udp", v6_address, kCandidatePriority, "", "",
cricket::Candidate candidate8(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
v6_address, kCandidatePriority, "", "",
cricket::LOCAL_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation2);
@ -630,31 +630,31 @@ class WebRtcSdpTest : public testing::Test {
int port_stun = 2345;
rtc::SocketAddress address_stun("74.125.127.126", port_stun++);
rtc::SocketAddress rel_address_stun("192.168.1.5", port_stun++);
cricket::Candidate candidate9("", cricket::ICE_CANDIDATE_COMPONENT_RTP,
"udp", address_stun, kCandidatePriority, "",
"", STUN_PORT_TYPE, kCandidateGeneration,
cricket::Candidate candidate9(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
address_stun, kCandidatePriority, "", "",
STUN_PORT_TYPE, kCandidateGeneration,
kCandidateFoundation3);
candidate9.set_related_address(rel_address_stun);
address_stun.SetPort(port_stun++);
rel_address_stun.SetPort(port_stun++);
cricket::Candidate candidate10("", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
"udp", address_stun, kCandidatePriority, "",
"", STUN_PORT_TYPE, kCandidateGeneration,
cricket::Candidate candidate10(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
address_stun, kCandidatePriority, "", "",
STUN_PORT_TYPE, kCandidateGeneration,
kCandidateFoundation3);
candidate10.set_related_address(rel_address_stun);
// relay
int port_relay = 3456;
rtc::SocketAddress address_relay("74.125.224.39", port_relay++);
cricket::Candidate candidate11("", cricket::ICE_CANDIDATE_COMPONENT_RTCP,
"udp", address_relay, kCandidatePriority, "",
"", cricket::RELAY_PORT_TYPE,
cricket::Candidate candidate11(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
address_relay, kCandidatePriority, "", "",
cricket::RELAY_PORT_TYPE,
kCandidateGeneration, kCandidateFoundation4);
address_relay.SetPort(port_relay++);
cricket::Candidate candidate12("", cricket::ICE_CANDIDATE_COMPONENT_RTP,
"udp", address_relay, kCandidatePriority, "",
"", RELAY_PORT_TYPE, kCandidateGeneration,
cricket::Candidate candidate12(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
address_relay, kCandidatePriority, "", "",
RELAY_PORT_TYPE, kCandidateGeneration,
kCandidateFoundation4);
// voice
@ -1612,7 +1612,7 @@ TEST_F(WebRtcSdpTest, SerializeCandidates) {
// TODO(mallinath) : Enable this test once WebRTCSdp capable of parsing
// RFC 6544.
TEST_F(WebRtcSdpTest, SerializeTcpCandidates) {
Candidate candidate("", ICE_CANDIDATE_COMPONENT_RTP, "tcp",
Candidate candidate(ICE_CANDIDATE_COMPONENT_RTP, "tcp",
rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority,
"", "", LOCAL_PORT_TYPE, kCandidateGeneration,
kCandidateFoundation1);
@ -1905,7 +1905,7 @@ TEST_F(WebRtcSdpTest, DeserializeCandidate) {
sdp = kSdpTcpActiveCandidate;
EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
// Make a cricket::Candidate equivalent to kSdpTcpCandidate string.
Candidate candidate("", ICE_CANDIDATE_COMPONENT_RTP, "tcp",
Candidate candidate(ICE_CANDIDATE_COMPONENT_RTP, "tcp",
rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority,
"", "", LOCAL_PORT_TYPE, kCandidateGeneration,
kCandidateFoundation1);

View File

@ -20,6 +20,7 @@
#include "webrtc/p2p/base/constants.h"
#include "webrtc/base/basictypes.h"
#include "webrtc/base/helpers.h"
#include "webrtc/base/network.h"
#include "webrtc/base/socketaddress.h"
@ -32,13 +33,13 @@ class Candidate {
// TODO: Match the ordering and param list as per RFC 5245
// candidate-attribute syntax. http://tools.ietf.org/html/rfc5245#section-15.1
Candidate()
: component_(0),
: id_(rtc::CreateRandomString(8)),
component_(0),
priority_(0),
network_type_(rtc::ADAPTER_TYPE_UNKNOWN),
generation_(0) {}
Candidate(const std::string& id,
int component,
Candidate(int component,
const std::string& protocol,
const rtc::SocketAddress& address,
uint32 priority,
@ -47,7 +48,7 @@ class Candidate {
const std::string& type,
uint32 generation,
const std::string& foundation)
: id_(id),
: id_(rtc::CreateRandomString(8)),
component_(component),
protocol_(protocol),
address_(address),
@ -154,15 +155,10 @@ class Candidate {
// We ignore the network name, since that is just debug information, and
// the priority, since that should be the same if the rest is (and it's
// a float so equality checking is always worrisome).
return (id_ == c.id_) &&
(component_ == c.component_) &&
(protocol_ == c.protocol_) &&
(address_ == c.address_) &&
(username_ == c.username_) &&
(password_ == c.password_) &&
(type_ == c.type_) &&
(generation_ == c.generation_) &&
(foundation_ == c.foundation_) &&
return (component_ == c.component_) && (protocol_ == c.protocol_) &&
(address_ == c.address_) && (username_ == c.username_) &&
(password_ == c.password_) && (type_ == c.type_) &&
(generation_ == c.generation_) && (foundation_ == c.foundation_) &&
(related_address_ == c.related_address_);
}

View File

@ -505,14 +505,18 @@ void P2PTransportChannel::OnUnknownAddress(
}
}
std::string id = rtc::CreateRandomString(8);
new_remote_candidate =
Candidate(id, component(), ProtoToString(proto), address, 0,
remote_username, remote_password, type, 0U,
rtc::ToString<uint32>(rtc::ComputeCrc32(id)));
new_remote_candidate.set_priority(
new_remote_candidate.GetPriority(ICE_TYPE_PREFERENCE_SRFLX,
port->Network()->preference(), 0));
Candidate(component(), ProtoToString(proto), address, 0,
remote_username, remote_password, type, 0U, "");
// From RFC 5245, section-7.2.1.3:
// The foundation of the candidate is set to an arbitrary value, different
// from the foundation for all other remote candidates.
new_remote_candidate.set_foundation(
rtc::ToString<uint32>(rtc::ComputeCrc32(new_remote_candidate.id())));
new_remote_candidate.set_priority(new_remote_candidate.GetPriority(
ICE_TYPE_PREFERENCE_SRFLX, port->Network()->preference(), 0));
}
if (port->IceProtocol() == ICEPROTO_RFC5245) {