Author: rmudgett
Date: Fri Mar  6 16:59:29 2015
New Revision: 432595

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432595
Log:
res_pjsip_refer: Make safely get the context for a blind transfer.

Made safely get the TRANSFER_CONTEXT channel value while the channel is
locked in refer_incoming_attended_request() and
refer_incoming_blind_request().  The pointer returned by
pbx_builtin_getvar_helper() is only valid while the channel is locked.
........

Merged revisions 432594 from http://svn.asterisk.org/svn/asterisk/branches/13

Modified:
    trunk/   (props changed)
    trunk/res/res_pjsip_refer.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-13-merged' - no diff available.

Modified: trunk/res/res_pjsip_refer.c
URL: 
http://svnview.digium.com/svn/asterisk/trunk/res/res_pjsip_refer.c?view=diff&rev=432595&r1=432594&r2=432595
==============================================================================
--- trunk/res/res_pjsip_refer.c (original)
+++ trunk/res/res_pjsip_refer.c Fri Mar  6 16:59:29 2015
@@ -628,6 +628,26 @@
        }
 }
 
+/*!
+ * \internal
+ * \brief Set the passed in context variable to the determined transfer 
context.
+ * \since 13.3.0
+ *
+ * \param context Set to the determined transfer context.
+ * \param session INVITE dialog SIP session.
+ */
+#define DETERMINE_TRANSFER_CONTEXT(context, session)                           
                                        \
+       do {                                                                    
                                                                                
        \
+               ast_channel_lock((session)->channel);                           
                                                        \
+               context = pbx_builtin_getvar_helper((session)->channel, 
"TRANSFER_CONTEXT");    \
+               if (ast_strlen_zero(context)) {                                 
                                                                \
+                       context = (session)->endpoint->context;                 
                                                        \
+               } else {                                                        
                                                                                
        \
+                       context = ast_strdupa(context);                         
                                                                \
+               }                                                               
                                                                                
                \
+               ast_channel_unlock((session)->channel);                         
                                                        \
+       } while (0)                                                             
                                                                                
        \
+
 static int refer_incoming_attended_request(struct ast_sip_session *session, 
pjsip_rx_data *rdata, pjsip_sip_uri *target_uri,
        pjsip_param *replaces_param, struct refer_progress *progress)
 {
@@ -678,12 +698,10 @@
 
                return 200;
        } else {
-               const char *context = 
pbx_builtin_getvar_helper(session->channel, "TRANSFER_CONTEXT");
+               const char *context;
                struct refer_blind refer = { 0, };
 
-               if (ast_strlen_zero(context)) {
-                       context = session->endpoint->context;
-               }
+               DETERMINE_TRANSFER_CONTEXT(context, session);
 
                if (!ast_exists_extension(NULL, context, "external_replaces", 
1, NULL)) {
                        ast_log(LOG_ERROR, "Received REFER for remote session 
on channel '%s' from endpoint '%s' but 'external_replaces' extension not found 
in context %s\n",
@@ -721,10 +739,7 @@
        struct refer_blind refer = { 0, };
 
        /* If no explicit transfer context has been provided use their 
configured context */
-       context = pbx_builtin_getvar_helper(session->channel, 
"TRANSFER_CONTEXT");
-       if (ast_strlen_zero(context)) {
-               context = session->endpoint->context;
-       }
+       DETERMINE_TRANSFER_CONTEXT(context, session);
 
        /* Using the user portion of the target URI see if it exists as a valid 
extension in their context */
        ast_copy_pj_str(exten, &target->user, sizeof(exten));


-- 
_____________________________________________________________________
-- 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