From bf6346ef2a83a50342588bbb7f69524089968f43 Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Wed, 16 Dec 2015 03:58:09 +0000 Subject: 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 --- pjnath/src/pjnath/ice_strans.c | 50 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) 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; icfg.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; jcand_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); -- cgit v1.2.3