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: https://svn.pjsip.org/repos/pjproject/trunk@1878 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index 8b813fa..4b8d40c 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -2070,6 +2070,14 @@
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 @@
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. */