summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins2 <jenkins2@gerrit.asterisk.org>2018-04-11 07:11:16 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2018-04-11 07:11:16 -0500
commitfabfe701bbd4f05d0a959ed735b7a3658dce455e (patch)
tree916025ec2ae80170cad6407fa654d3d11cedb6c1
parent8af759c088b845f991e9701f4915adef8a3d1f40 (diff)
parent0c03eab9626a3262d6b4f122ceaca29e7d390bbc (diff)
Merge "res_pjsip_refer/chan_sip: Fix INVITE with replaces transfer to ConfBridge"
-rw-r--r--channels/chan_sip.c5
-rw-r--r--include/asterisk/bridge.h11
-rw-r--r--main/bridge.c8
-rw-r--r--res/res_pjsip_refer.c5
4 files changed, 17 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index c357785ab..46f9ad699 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -25887,10 +25887,7 @@ static int handle_invite_replaces(struct sip_pvt *p, struct sip_request *req,
ast_raw_answer(c);
- ast_channel_lock(replaces_chan);
- bridge = ast_channel_get_bridge(replaces_chan);
- ast_channel_unlock(replaces_chan);
-
+ bridge = ast_bridge_transfer_acquire_bridge(replaces_chan);
if (bridge) {
/*
* We have two refs of the channel. One is held in c and the other
diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h
index b23255844..c96cefb60 100644
--- a/include/asterisk/bridge.h
+++ b/include/asterisk/bridge.h
@@ -954,6 +954,17 @@ void ast_bridge_remove_video_src(struct ast_bridge *bridge, struct ast_channel *
*/
const char *ast_bridge_video_mode_to_string(enum ast_bridge_video_mode_type video_mode);
+/*!
+ * \brief Acquire the channel's bridge for transfer purposes.
+ * \since 13.21.0
+ *
+ * \param chan Channel involved in a transfer.
+ *
+ * \return The bridge the channel is in or NULL if it either isn't
+ * in a bridge or should not be considered to be in a bridge.
+ */
+struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan);
+
enum ast_transfer_result {
/*! The transfer completed successfully */
AST_BRIDGE_TRANSFER_SUCCESS,
diff --git a/main/bridge.c b/main/bridge.c
index 93c53dd15..8795081e2 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -4427,7 +4427,7 @@ static void set_transfer_variables_all(struct ast_channel *transferer, struct ao
ao2_iterator_destroy(&iter);
}
-static struct ast_bridge *acquire_bridge(struct ast_channel *chan)
+struct ast_bridge *ast_bridge_transfer_acquire_bridge(struct ast_channel *chan)
{
struct ast_bridge *bridge;
@@ -4468,7 +4468,7 @@ enum ast_transfer_result ast_bridge_transfer_blind(int is_external,
return AST_BRIDGE_TRANSFER_FAIL;
}
- bridge = acquire_bridge(transferer);
+ bridge = ast_bridge_transfer_acquire_bridge(transferer);
if (!bridge) {
transfer_result = AST_BRIDGE_TRANSFER_INVALID;
goto publish;
@@ -4715,8 +4715,8 @@ enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_tra
const char *app = NULL;
int hangup_target = 0;
- to_transferee_bridge = acquire_bridge(to_transferee);
- to_target_bridge = acquire_bridge(to_transfer_target);
+ to_transferee_bridge = ast_bridge_transfer_acquire_bridge(to_transferee);
+ to_target_bridge = ast_bridge_transfer_acquire_bridge(to_transfer_target);
transfer_msg = ast_attended_transfer_message_create(1, to_transferee, to_transferee_bridge,
to_transfer_target, to_target_bridge, NULL, NULL);
diff --git a/res/res_pjsip_refer.c b/res/res_pjsip_refer.c
index 7d892f653..120203c95 100644
--- a/res/res_pjsip_refer.c
+++ b/res/res_pjsip_refer.c
@@ -917,10 +917,7 @@ static int invite_replaces(void *data)
ast_channel_ref(invite->session->channel);
invite->channel = invite->session->channel;
- ast_channel_lock(invite->channel);
- invite->bridge = ast_channel_get_bridge(invite->channel);
- ast_channel_unlock(invite->channel);
-
+ invite->bridge = ast_bridge_transfer_acquire_bridge(invite->channel);
return 0;
}