[Asterisk-code-review] Unset BRIDGEPEER when leaving a bridge (asterisk[master])

Jonathan Rose asteriskteam at digium.com
Tue Dec 1 16:24:27 CST 2015


Jonathan Rose has uploaded a new change for review.

  https://gerrit.asterisk.org/1749

Change subject: Unset BRIDGEPEER when leaving a bridge
......................................................................

Unset BRIDGEPEER when leaving a bridge

Currently if a channel is transferred out of a bridge, the BRIDGEPEER
variable (also BRIDGEPVTCALLID) remain set even once the channel is
out of the bridge. This patch removes these variables when leaving
the bridge.

ASTERISK-25600 #close
Reported by: Mark Michelson

Change-Id: I753ead2fffbfc65427ed4e9244c7066610e546da
---
M include/asterisk/bridge.h
M main/bridge.c
M main/bridge_channel.c
3 files changed, 34 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/49/1749/1

diff --git a/include/asterisk/bridge.h b/include/asterisk/bridge.h
index 8858cf0..f7ef376 100644
--- a/include/asterisk/bridge.h
+++ b/include/asterisk/bridge.h
@@ -746,6 +746,25 @@
  */
 int ast_bridge_unsuspend(struct ast_bridge *bridge, struct ast_channel *chan);
 
+/*!
+ * \brief Sets BRIDGECHANNEL and BRIDGEPVTCALLID for a channel
+ *
+ * \param name channel name of the bridged peer
+ * \param pvtid Private CallID of the bridged peer
+ *
+ * \return nothing
+ */
+void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid);
+
+/*!
+ * \brief Clears BRIDGECHANNEL and BRIDGEPVTCALLID for a channel
+ *
+ * \return Nothing
+ *
+ * \note Invoked on leaving a bridge
+ */
+void ast_bridge_vars_clear(struct ast_channel *chan);
+
 struct ast_unreal_pvt;
 
 /*!
diff --git a/main/bridge.c b/main/bridge.c
index ebbfc39..d5eae50 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -1211,11 +1211,19 @@
 	}
 }
 
-static void update_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid)
+void ast_bridge_vars_set(struct ast_channel *chan, const char *name, const char *pvtid)
 {
 	ast_channel_stage_snapshot(chan);
 	pbx_builtin_setvar_helper(chan, "BRIDGEPEER", name);
 	pbx_builtin_setvar_helper(chan, "BRIDGEPVTCALLID", pvtid);
+	ast_channel_stage_snapshot_done(chan);
+}
+
+void ast_bridge_vars_clear(struct ast_channel *chan)
+{
+	ast_channel_stage_snapshot(chan);
+	pbx_builtin_setvar_helper(chan, "BRIDGEPEER", NULL);
+	pbx_builtin_setvar_helper(chan, "BRIDGEPVTCALLID", NULL);
 	ast_channel_stage_snapshot_done(chan);
 }
 
@@ -1251,12 +1259,12 @@
 	ast_channel_unlock(c1);
 
 	ast_channel_lock(c0);
-	update_bridge_vars_set(c0, c1_name, c1_pvtid);
+	ast_bridge_vars_set(c0, c1_name, c1_pvtid);
 	UPDATE_BRIDGE_VARS_GET(c0, c0_name, c0_pvtid);
 	ast_channel_unlock(c0);
 
 	ast_channel_lock(c1);
-	update_bridge_vars_set(c1, c0_name, c0_pvtid);
+	ast_bridge_vars_set(c1, c0_name, c0_pvtid);
 	ast_channel_unlock(c1);
 }
 
@@ -1357,7 +1365,7 @@
 		++idx;
 
 		ast_channel_lock(bridge_channel->chan);
-		update_bridge_vars_set(bridge_channel->chan, buf, NULL);
+		ast_bridge_vars_set(bridge_channel->chan, buf, NULL);
 		ast_channel_unlock(bridge_channel->chan);
 	}
 }
@@ -1379,7 +1387,7 @@
 
 	AST_LIST_TRAVERSE(&bridge->channels, bridge_channel, entry) {
 		ast_channel_lock(bridge_channel->chan);
-		update_bridge_vars_set(bridge_channel->chan, NULL, NULL);
+		ast_bridge_vars_set(bridge_channel->chan, NULL, NULL);
 		ast_channel_unlock(bridge_channel->chan);
 	}
 }
diff --git a/main/bridge_channel.c b/main/bridge_channel.c
index be0819a..b263f8f 100644
--- a/main/bridge_channel.c
+++ b/main/bridge_channel.c
@@ -289,6 +289,8 @@
 
 	channel_set_cause(bridge_channel->chan, cause);
 
+	ast_bridge_vars_clear(bridge_channel->chan);
+
 	/* Change the state on the bridge channel */
 	bridge_channel->state = new_state;
 

-- 
To view, visit https://gerrit.asterisk.org/1749
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I753ead2fffbfc65427ed4e9244c7066610e546da
Gerrit-PatchSet: 1
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Jonathan Rose <jrose at digium.com>



More information about the asterisk-code-review mailing list