summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2014-10-01 06:45:02 +0000
committerLiong Sauw Ming <ming@teluu.com>2014-10-01 06:45:02 +0000
commit364c1569cf0015664cd6d3b5d2737aa04d02ece7 (patch)
tree219789a64e57d38f86389857f2b5e936a92a3f5e /pjsip
parentc92580e3d8e95c6d7bfe9fc2cdaa06a669f2bfd2 (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.c38
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.