]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_rtp_asterisk: Crash if no candidates received for component
authorKevin Harwell <kharwell@digium.com>
Thu, 9 Oct 2014 21:28:15 +0000 (21:28 +0000)
committerKevin Harwell <kharwell@digium.com>
Thu, 9 Oct 2014 21:28:15 +0000 (21:28 +0000)
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/
........

Merged revisions 425029 from http://svn.asterisk.org/svn/asterisk/branches/11

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@425030 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_rtp_asterisk.c

index 6a49556f6ace629b1866e01a5c20a09a7def37fd..e1af6b82e5e49c28545ebc3a8d8aa0121f77f19e 100644 (file)
@@ -643,7 +643,7 @@ static void ast_rtp_ice_start(struct ast_rtp_instance *instance)
        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 @@ static void ast_rtp_ice_start(struct ast_rtp_instance *instance)
        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 @@ static void ast_rtp_ice_start(struct ast_rtp_instance *instance)
 
        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);