[asterisk-commits] rmudgett: branch 13 r432594 - /branches/13/res/res_pjsip_refer.c
SVN commits to the Asterisk project
asterisk-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 asterisk-commits
mailing list