Commit c4993988 authored by Fabrice Bellet's avatar Fabrice Bellet Committed by Olivier Crête
Browse files

discovery: ensure port number uniqueness agent-wide

The port number must be different for all local host candidates, not
just in the same component, but across all components and all streams.
A candidate ambiguity between a host local host and an identical server
reflexive candidate have more unwanted consequences when it concerns two
different components, because an inbound stun request may be associated
to a wrong component.
parent 25ad2c7a
Pipeline #143163 failed with stages
in 60 minutes and 52 seconds
...@@ -607,23 +607,31 @@ void priv_generate_candidate_credentials (NiceAgent *agent, ...@@ -607,23 +607,31 @@ void priv_generate_candidate_credentials (NiceAgent *agent,
} }
static gboolean static gboolean
priv_local_host_candidate_duplicate_port (NiceComponent *component, priv_local_host_candidate_duplicate_port (NiceAgent *agent,
NiceCandidate *candidate) NiceCandidate *candidate)
{ {
GSList *i; GSList *i, *j, *k;
if (candidate->transport == NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE) if (candidate->transport == NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE)
return FALSE; return FALSE;
for (i = component->local_candidates; i; i = i->next) { for (i = agent->streams; i; i = i->next) {
NiceCandidate *c = i->data; NiceStream *stream = i->data;
if (candidate->transport == c->transport && for (j = stream->components; j; j = j->next) {
nice_address_ip_version (&candidate->addr) == NiceComponent *component = j->data;
nice_address_ip_version (&c->addr) &&
nice_address_get_port (&candidate->addr) == for (k = component->local_candidates; k; k = k->next) {
nice_address_get_port (&c->addr)) NiceCandidate *c = k->data;
return TRUE;
if (candidate->transport == c->transport &&
nice_address_ip_version (&candidate->addr) ==
nice_address_ip_version (&c->addr) &&
nice_address_get_port (&candidate->addr) ==
nice_address_get_port (&c->addr))
return TRUE;
}
}
} }
return FALSE; return FALSE;
} }
...@@ -693,7 +701,7 @@ HostCandidateResult discovery_add_local_host_candidate ( ...@@ -693,7 +701,7 @@ HostCandidateResult discovery_add_local_host_candidate (
candidate->addr = nicesock->addr; candidate->addr = nicesock->addr;
candidate->base_addr = nicesock->addr; candidate->base_addr = nicesock->addr;
if (priv_local_host_candidate_duplicate_port (component, candidate)) { if (priv_local_host_candidate_duplicate_port (agent, candidate)) {
res = HOST_CANDIDATE_DUPLICATE_PORT; res = HOST_CANDIDATE_DUPLICATE_PORT;
goto errors; goto errors;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment