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. */