Author: mmichelson
Date: Fri Jan 16 16:12:25 2015
New Revision: 430714

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=430714
Log:
Fix problem where a hung channel could occur on a failed blind transfer.

Different clients react differently to being told that a blind transfer
has failed. Some will simply send a BYE and be done with it. Others will
attempt to reinvite themselves back onto the call.

In the latter case, we were creating a new channel and then leaving it to
sit forever doing nothing. With this code change, that new channel will
not be created and the dialog with the transferring channel will be cleaned
up properly.

ASTERISK-24624 #close
Reported by Zane Conkle

Review: https://reviewboard.asterisk.org/r/4339


Modified:
    branches/13/channels/chan_pjsip.c
    branches/13/res/res_pjsip_session.c

Modified: branches/13/channels/chan_pjsip.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/channels/chan_pjsip.c?view=diff&rev=430714&r1=430713&r2=430714
==============================================================================
--- branches/13/channels/chan_pjsip.c (original)
+++ branches/13/channels/chan_pjsip.c Fri Jan 16 16:12:25 2015
@@ -2014,6 +2014,21 @@
                return 0;
        }
 
+       if (session->inv_session->state >= PJSIP_INV_STATE_CONFIRMED) {
+               /* Weird case. We've received a reinvite but we don't have a 
channel. The most
+                * typical case for this happening is that a blind transfer 
fails, and so the
+                * transferer attempts to reinvite himself back into the call. 
We already got
+                * rid of that channel, and the other side of the call is 
unrecoverable.
+                *
+                * We treat this as a failure, so our best bet is to just hang 
this call
+                * up and not create a new channel. Clearing defer_terminate 
here ensures that
+                * calling ast_sip_session_terminate() can result in a BYE 
being sent ASAP.
+                */
+               session->defer_terminate = 0;
+               ast_sip_session_terminate(session, 400);
+               return -1;
+       }
+
        datastore = ast_sip_session_alloc_datastore(&transport_info, 
"transport_info");
        if (!datastore) {
                return -1;

Modified: branches/13/res/res_pjsip_session.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/res/res_pjsip_session.c?view=diff&rev=430714&r1=430713&r2=430714
==============================================================================
--- branches/13/res/res_pjsip_session.c (original)
+++ branches/13/res/res_pjsip_session.c Fri Jan 16 16:12:25 2015
@@ -779,7 +779,8 @@
 
        if (rdata->msg_info.msg->line.req.method.id != PJSIP_INVITE_METHOD ||
                !(dlg = pjsip_ua_find_dialog(&rdata->msg_info.cid->id, 
&rdata->msg_info.to->tag, &rdata->msg_info.from->tag, PJ_FALSE)) ||
-               !(session = ast_sip_dialog_get_session(dlg))) {
+               !(session = ast_sip_dialog_get_session(dlg)) ||
+               !session->channel) {
                return PJ_FALSE;
        }
 


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to