diff options
author | Liong Sauw Ming <ming@teluu.com> | 2014-10-01 06:45:02 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2014-10-01 06:45:02 +0000 |
commit | 364c1569cf0015664cd6d3b5d2737aa04d02ece7 (patch) | |
tree | 219789a64e57d38f86389857f2b5e936a92a3f5e /pjsip | |
parent | c92580e3d8e95c6d7bfe9fc2cdaa06a669f2bfd2 (diff) |
Fixed #1795: Assertion if ending 100rel session when invite on early state
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4936 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/src/pjsip-ua/sip_100rel.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/pjsip/src/pjsip-ua/sip_100rel.c b/pjsip/src/pjsip-ua/sip_100rel.c index 3a953e53..0aa19557 100644 --- a/pjsip/src/pjsip-ua/sip_100rel.c +++ b/pjsip/src/pjsip-ua/sip_100rel.c @@ -375,6 +375,19 @@ PJ_DEF(pj_status_t) pjsip_100rel_send_prack( pjsip_inv_session *inv, } +/* Clear all responses in the transmission list */ +static void clear_all_responses(dlg_data *dd) +{ + tx_data_list_t *tl; + + tl = dd->uas_state->tx_data_list.next; + while (tl != &dd->uas_state->tx_data_list) { + pjsip_tx_data_dec_ref(tl->tdata); + tl = tl->next; + } + pj_list_init(&dd->uas_state->tx_data_list); +} + /* * Notify 100rel module that the invite session has been disconnected. */ @@ -388,8 +401,16 @@ PJ_DEF(pj_status_t) pjsip_100rel_end_session(pjsip_inv_session *inv) /* Make sure we don't have pending transmission */ if (dd->uas_state) { - pj_assert(!dd->uas_state->retransmit_timer.id); - pj_assert(pj_list_empty(&dd->uas_state->tx_data_list)); + /* Cancel the retransmit timer */ + if (dd->uas_state->retransmit_timer.id) { + pjsip_endpt_cancel_timer(dd->inv->dlg->endpt, + &dd->uas_state->retransmit_timer); + dd->uas_state->retransmit_timer.id = PJ_FALSE; + } + if (!pj_list_empty(&dd->uas_state->tx_data_list)) { + /* Clear all pending responses (drop 'em) */ + clear_all_responses(dd); + } } return PJ_SUCCESS; @@ -426,19 +447,6 @@ static void parse_rack(const pj_str_t *rack, } } -/* Clear all responses in the transmission list */ -static void clear_all_responses(dlg_data *dd) -{ - tx_data_list_t *tl; - - tl = dd->uas_state->tx_data_list.next; - while (tl != &dd->uas_state->tx_data_list) { - pjsip_tx_data_dec_ref(tl->tdata); - tl = tl->next; - } - pj_list_init(&dd->uas_state->tx_data_list); -} - /* * Handle incoming PRACK request. |