summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiza Sulistyo <riza@teluu.com>2015-12-16 03:58:09 +0000
committerRiza Sulistyo <riza@teluu.com>2015-12-16 03:58:09 +0000
commitbf6346ef2a83a50342588bbb7f69524089968f43 (patch)
treefcfced626564992831047bd52e85621dcf0c2a8e
parent7c3bbef6996038e4351626b8bf2d6a415518e6e3 (diff)
Re #1882 (misc): Check for duplicate entry when building list of ICE host candidate. Thanks to Dusan Klenic for the original patch.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5215 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjnath/src/pjnath/ice_strans.c50
1 files changed, 49 insertions, 1 deletions
diff --git a/pjnath/src/pjnath/ice_strans.c b/pjnath/src/pjnath/ice_strans.c
index c20debe0..aee0c39d 100644
--- a/pjnath/src/pjnath/ice_strans.c
+++ b/pjnath/src/pjnath/ice_strans.c
@@ -347,6 +347,30 @@ static pj_status_t add_update_turn(pj_ice_strans *ice_st,
return PJ_SUCCESS;
}
+static pj_bool_t ice_cand_equals(pj_ice_sess_cand *lcand,
+ pj_ice_sess_cand *rcand)
+{
+ if (lcand == NULL && rcand == NULL){
+ return PJ_TRUE;
+ }
+ if (lcand == NULL || rcand == NULL){
+ return PJ_FALSE;
+ }
+
+ if (lcand->type != rcand->type
+ || lcand->status != rcand->status
+ || lcand->comp_id != rcand->comp_id
+ || lcand->transport_id != rcand->transport_id
+ || lcand->local_pref != rcand->local_pref
+ || lcand->prio != rcand->prio
+ || pj_sockaddr_cmp(&lcand->addr, &rcand->addr) != 0
+ || pj_sockaddr_cmp(&lcand->base_addr, &rcand->base_addr) != 0)
+ {
+ return PJ_FALSE;
+ }
+
+ return PJ_TRUE;
+}
/*
* Create the component.
@@ -478,6 +502,8 @@ static pj_status_t create_comp(pj_ice_strans *ice_st, unsigned comp_id)
for (i=0; i<stun_sock_info.alias_cnt &&
i<ice_st->cfg.stun.max_host_cands; ++i)
{
+ unsigned j;
+ pj_bool_t cand_duplicate = PJ_FALSE;
char addrinfo[PJ_INET6_ADDRSTRLEN+10];
const pj_sockaddr *addr = &stun_sock_info.aliases[i];
@@ -495,7 +521,7 @@ static pj_status_t create_comp(pj_ice_strans *ice_st, unsigned comp_id)
continue;
}
- cand = &comp->cand_list[comp->cand_cnt++];
+ cand = &comp->cand_list[comp->cand_cnt];
cand->type = PJ_ICE_CAND_TYPE_HOST;
cand->status = PJ_SUCCESS;
@@ -505,6 +531,28 @@ static pj_status_t create_comp(pj_ice_strans *ice_st, unsigned comp_id)
pj_sockaddr_cp(&cand->addr, addr);
pj_sockaddr_cp(&cand->base_addr, addr);
pj_bzero(&cand->rel_addr, sizeof(cand->rel_addr));
+
+ /* Check if not already in list */
+ for (j=0; j<comp->cand_cnt; j++) {
+ if (ice_cand_equals(cand, &comp->cand_list[j])) {
+ cand_duplicate = PJ_TRUE;
+ break;
+ }
+ }
+
+ if (cand_duplicate) {
+ PJ_LOG(4, (ice_st->obj_name,
+ "Comp %d: host candidate %s is a duplicate",
+ comp_id, pj_sockaddr_print(&cand->addr, addrinfo,
+ sizeof(addrinfo), 3)));
+
+ pj_bzero(&cand->addr, sizeof(cand->addr));
+ pj_bzero(&cand->base_addr, sizeof(cand->base_addr));
+ continue;
+ } else {
+ comp->cand_cnt+=1;
+ }
+
pj_ice_calc_foundation(ice_st->pool, &cand->foundation,
cand->type, &cand->base_addr);