From 1cd12d73a60aaf8a6940ebf5d7791c4c9d5409ac Mon Sep 17 00:00:00 2001 From: Richard Mudgett Date: Wed, 17 Aug 2016 14:13:56 -0500 Subject: res_pjsip_session.c: Fix unbound srv failover tests. Commit 1b666549f33d69dc080b212bf92126f3bc3a18b2 broke the srv failover functionality if a TCP connection gets disconnected. Under these conditions, session_inv_on_state_changed() gets a PJSIP_EVENT_TRANSPORT_ERROR and restarts the INVITE transaction on a new transport. Unfortunately, session_inv_on_tsx_state_changed() also gets the same PJSIP_EVENT_TRANSPORT_ERROR event and unconditionally terminates the session. * Made session_inv_on_tsx_state_changed() complete terminating the session on PJSIP_EVENT_TRANSPORT_ERROR only if the session state is still PJSIP_INV_STATE_DISCONNECTED. ASTERISK-26305 #close Reported by: Richard Mudgett Change-Id: If736e766b5c55b970fa38ca6c8a885caf27b897d --- res/res_pjsip_session.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'res') diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index a41e0aa5d..856626a02 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -2741,22 +2741,21 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans } break; case PJSIP_EVENT_TRANSPORT_ERROR: - /* - * Clear the module data now to block session_inv_on_state_changed() - * from calling session_end() if it hasn't already done so. - */ - inv->mod_data[id] = NULL; + if (inv->state == PJSIP_INV_STATE_DISCONNECTED) { + /* + * Clear the module data now to block session_inv_on_state_changed() + * from calling session_end() if it hasn't already done so. + */ + inv->mod_data[id] = NULL; - if (inv->state != PJSIP_INV_STATE_DISCONNECTED) { - session_end(session); + /* + * Pass the session ref held by session->inv_session to + * session_end_completion(). + */ + session_end_completion(session); + return; } - - /* - * Pass the session ref held by session->inv_session to - * session_end_completion(). - */ - session_end_completion(session); - return; + break; case PJSIP_EVENT_TIMER: /* * The timer event is run by the pjsip monitor thread and not @@ -2776,7 +2775,8 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans * Pass the session ref held by session->inv_session to * session_end_completion(). */ - if (ast_sip_push_task(session->serializer, session_end_completion, session)) { + if (session + && ast_sip_push_task(session->serializer, session_end_completion, session)) { /* Do it anyway even though this is not the right thread. */ session_end_completion(session); } -- cgit v1.2.3