From 7f5db291ab29a7396137961f69470562f5bce4a7 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Thu, 20 Mar 2008 14:40:50 +0000 Subject: Ticket #514: bug with handling simultaneous outgoing re-INVITE, the invite session does not check if we have an ongoing INVITE transaction (thanks Philippe Leuba) git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1878 74dad513-b988-da41-8d7b-12977e46ad98 --- pjsip/src/pjsip-ua/sip_inv.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'pjsip') diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c index 8b813fa2..4b8d40c2 100644 --- a/pjsip/src/pjsip-ua/sip_inv.c +++ b/pjsip/src/pjsip-ua/sip_inv.c @@ -2070,6 +2070,14 @@ PJ_DEF(pj_status_t) pjsip_inv_send_msg( pjsip_inv_session *inv, pjsip_dlg_inc_lock(inv->dlg); + /* Check again that we didn't receive incoming re-INVITE */ + if (inv->invite_tsx) { + pjsip_tx_data_dec_ref(tdata); + pjsip_dlg_dec_lock(inv->dlg); + return PJ_EINVALIDOP; + } + + /* Associate our data in outgoing invite transaction */ tsx_inv_data = PJ_POOL_ZALLOC_T(inv->pool, struct tsx_inv_data); tsx_inv_data->inv = inv; @@ -3274,11 +3282,19 @@ static void inv_on_state_confirmed( pjsip_inv_session *inv, pjsip_event *e) else if (tsx->method.id == PJSIP_INVITE_METHOD && tsx->role == PJSIP_ROLE_UAC) { + /* Must not have other pending INVITE transaction */ + pj_assert(inv->invite_tsx==NULL || tsx==inv->invite_tsx); + /* * Handle outgoing re-INVITE */ - if (tsx->state == PJSIP_TSX_STATE_TERMINATED && - tsx->status_code/100 == 2) + if (tsx->state == PJSIP_TSX_STATE_CALLING) { + + /* Save pending invite transaction */ + inv->invite_tsx = tsx; + + } else if (tsx->state == PJSIP_TSX_STATE_TERMINATED && + tsx->status_code/100 == 2) { /* Re-INVITE was accepted. */ -- cgit v1.2.3