Author: kharwell Date: Thu Oct 9 16:26:43 2014 New Revision: 425029 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=425029 Log: res_rtp_asterisk: Crash if no candidates received for component
When starting ice if there is not at least one remote ice candidate with an RTP component asterisk will crash. This is due to an assertion in pjnath as it expects at least one candidate with an RTP component. Added a check to make sure at least one candidate contains an RTP component and at least one candidate has an RTCP component. ASTERISK-24383 #close Review: https://reviewboard.asterisk.org/r/4039/ Modified: branches/11/res/res_rtp_asterisk.c Modified: branches/11/res/res_rtp_asterisk.c URL: http://svnview.digium.com/svn/asterisk/branches/11/res/res_rtp_asterisk.c?view=diff&rev=425029&r1=425028&r2=425029 ============================================================================== --- branches/11/res/res_rtp_asterisk.c (original) +++ branches/11/res/res_rtp_asterisk.c Thu Oct 9 16:26:43 2014 @@ -643,7 +643,7 @@ pj_ice_sess_cand candidates[PJ_ICE_MAX_CAND]; struct ao2_iterator i; struct ast_rtp_engine_ice_candidate *candidate; - int cand_cnt = 0; + int cand_cnt = 0, has_rtp = 0, has_rtcp = 0; if (!rtp->ice || !rtp->ice_proposed_remote_candidates) { return; @@ -675,6 +675,10 @@ while ((candidate = ao2_iterator_next(&i)) && (cand_cnt < PJ_ICE_MAX_CAND)) { pj_str_t address; + /* there needs to be at least one rtp and rtcp candidate in the list */ + has_rtp |= candidate->id == AST_RTP_ICE_COMPONENT_RTP; + has_rtcp |= candidate->id == AST_RTP_ICE_COMPONENT_RTCP; + pj_strdup2(rtp->ice->pool, &candidates[cand_cnt].foundation, candidate->foundation); candidates[cand_cnt].comp_id = candidate->id; candidates[cand_cnt].prio = candidate->priority; @@ -705,7 +709,9 @@ ao2_iterator_destroy(&i); - if (pj_ice_sess_create_check_list(rtp->ice, &ufrag, &passwd, ao2_container_count(rtp->ice_active_remote_candidates), &candidates[0]) == PJ_SUCCESS) { + if (has_rtp && has_rtcp && + pj_ice_sess_create_check_list(rtp->ice, &ufrag, &passwd, ao2_container_count( + rtp->ice_active_remote_candidates), &candidates[0]) == PJ_SUCCESS) { ast_test_suite_event_notify("ICECHECKLISTCREATE", "Result: SUCCESS"); pj_ice_sess_start_check(rtp->ice); pj_timer_heap_poll(timer_heap, NULL); -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
