From 75a21db6bbb6edb77bbf0b1471d408a20e9f3526 Mon Sep 17 00:00:00 2001 From: Michael Jerris Date: Fri, 10 Oct 2008 22:22:41 +0000 Subject: [PATCH] add error handling for when we get response to a invite that we don't have a session for (session timer after session destroyed?) git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9947 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/sofia.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index f93d456eab..7dfc3b9892 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -2149,6 +2149,29 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status } } } + + if (!session && (status == 180 || status == 183 || status == 200)) { + /* This should never happen. It means the sip stack thinks there is a call but FreeSWITCH does not */ + const char *callid = "n/a"; + + if (sip && sip->sip_call_id && sip->sip_call_id->i_id) callid = sip->sip_call_id->i_id; + + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "received response to invite with no matching session, destroying callid [%s]!\n", callid); + + if (nh) { + if (status == 200) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending BYE to orphan call.\n"); + nua_bye(nh, TAG_END()); + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Sending CANCEL to orphan call.\n"); + nua_cancel(nh, TAG_END()); + } + + nua_handle_bind(nh, NULL); + nua_handle_destroy(nh); + } + + } }