mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-19 19:52:48 +00:00
Merged revisions 181423 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r181423 | russell | 2009-03-11 16:42:58 -0500 (Wed, 11 Mar 2009) | 9 lines Make code that updates BRIDGEPEER variable thread-safe. It is not safe to read the name field of an ast_channel without the channel locked. This patch fixes some places in channel.c where this was being done, and lead to crashes related to masquerades. (closes issue #14623) Reported by: guillecabeza ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@181424 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -4549,6 +4549,29 @@ static void manager_bridge_event(int onoff, int type, struct ast_channel *c0, st
|
||||
S_OR(c1->cid.cid_num, ""));
|
||||
}
|
||||
|
||||
static void update_bridgepeer(struct ast_channel *c0, struct ast_channel *c1)
|
||||
{
|
||||
const char *c0_name;
|
||||
const char *c1_name;
|
||||
|
||||
ast_channel_lock(c1);
|
||||
c1_name = ast_strdupa(c1->name);
|
||||
ast_channel_unlock(c1);
|
||||
|
||||
ast_channel_lock(c0);
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c0, "BRIDGEPEER"))) {
|
||||
pbx_builtin_setvar_helper(c0, "BRIDGEPEER", c1_name);
|
||||
}
|
||||
c0_name = ast_strdupa(c0->name);
|
||||
ast_channel_unlock(c0);
|
||||
|
||||
ast_channel_lock(c1);
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c1, "BRIDGEPEER"))) {
|
||||
pbx_builtin_setvar_helper(c1, "BRIDGEPEER", c0_name);
|
||||
}
|
||||
ast_channel_unlock(c1);
|
||||
}
|
||||
|
||||
/*! \brief Bridge two channels together */
|
||||
enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_channel *c1,
|
||||
struct ast_bridge_config *config, struct ast_frame **fo, struct ast_channel **rc)
|
||||
@@ -4702,11 +4725,8 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
|
||||
break;
|
||||
}
|
||||
|
||||
/* See if the BRIDGEPEER variable needs to be updated */
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c0, "BRIDGEPEER")))
|
||||
pbx_builtin_setvar_helper(c0, "BRIDGEPEER", c1->name);
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c1, "BRIDGEPEER")))
|
||||
pbx_builtin_setvar_helper(c1, "BRIDGEPEER", c0->name);
|
||||
update_bridgepeer(c0, c1);
|
||||
|
||||
if (c0->tech->get_pvt_uniqueid)
|
||||
pbx_builtin_setvar_helper(c1, "BRIDGEPVTCALLID", c0->tech->get_pvt_uniqueid(c0));
|
||||
if (c1->tech->get_pvt_uniqueid)
|
||||
@@ -4780,10 +4800,7 @@ enum ast_bridge_result ast_channel_bridge(struct ast_channel *c0, struct ast_cha
|
||||
o1nativeformats = c1->nativeformats;
|
||||
}
|
||||
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c0, "BRIDGEPEER")))
|
||||
pbx_builtin_setvar_helper(c0, "BRIDGEPEER", c1->name);
|
||||
if (!ast_strlen_zero(pbx_builtin_getvar_helper(c1, "BRIDGEPEER")))
|
||||
pbx_builtin_setvar_helper(c1, "BRIDGEPEER", c0->name);
|
||||
update_bridgepeer(c0, c1);
|
||||
|
||||
res = ast_generic_bridge(c0, c1, config, fo, rc, config->nexteventts);
|
||||
if (res != AST_BRIDGE_RETRY) {
|
||||
|
Reference in New Issue
Block a user