discovery: ensure port number uniqueness agent-wide
authorFabrice Bellet <fabrice@bellet.info>
Thu, 16 Apr 2020 18:01:25 +0000 (20:01 +0200)
committerOlivier CrĂȘte <olivier.crete@ocrete.ca>
Wed, 6 May 2020 23:38:40 +0000 (23:38 +0000)
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.

agent/discovery.c

index c757031..f562bba 100644 (file)
@@ -607,23 +607,31 @@ void priv_generate_candidate_credentials (NiceAgent *agent,
 }
 
 static gboolean
-priv_local_host_candidate_duplicate_port (NiceComponent *component,
+priv_local_host_candidate_duplicate_port (NiceAgent *agent,
   NiceCandidate *candidate)
 {
-  GSList *i;
+  GSList *i, *j, *k;
 
   if (candidate->transport == NICE_CANDIDATE_TRANSPORT_TCP_ACTIVE)
     return FALSE;
 
-  for (i = component->local_candidates; i; i = i->next) {
-    NiceCandidate *c = i->data;
+  for (i = agent->streams; i; i = i->next) {
+    NiceStream *stream = i->data;
 
-    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;
+    for (j = stream->components; j; j = j->next) {
+      NiceComponent *component = j->data;
+
+      for (k = component->local_candidates; k; k = k->next) {
+        NiceCandidate *c = k->data;
+
+        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;
 }
@@ -693,7 +701,7 @@ HostCandidateResult discovery_add_local_host_candidate (
   candidate->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;
     goto errors;
   }