[svn-commits] rmudgett: branch 13 r432594 - /branches/13/res/res_pjsip_refer.c

SVN commits to the Digium repositories svn-commits at lists.digium.com
Fri Mar 6 16:50:42 CST 2015


Author: rmudgett
Date: Fri Mar  6 16:50:40 2015
New Revision: 432594

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=432594
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.

Modified:
    branches/13/res/res_pjsip_refer.c

Modified: branches/13/res/res_pjsip_refer.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/res/res_pjsip_refer.c?view=diff&rev=432594&r1=432593&r2=432594
==============================================================================
--- branches/13/res/res_pjsip_refer.c (original)
+++ branches/13/res/res_pjsip_refer.c Fri Mar  6 16:50:40 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));




More information about the svn-commits mailing list