From: Richard Mudgett Date: Thu, 10 May 2012 23:42:43 +0000 (+0000) Subject: * Made ast_change_name() hold the channels container lock while changing the channel... X-Git-Tag: 10.6.0-rc1~44 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=de95e541b4d8b154993dc26caf25378205937a59;p=thirdparty%2Fasterisk.git * Made ast_change_name() hold the channels container lock while changing the channel name. * Eliminate redundant list not empty check in clone_variables(). ........ Merged revisions 366240 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@366241 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/channel.c b/main/channel.c index 3ba0cbf7b6..2bb4a20e6a 100644 --- a/main/channel.c +++ b/main/channel.c @@ -6321,11 +6321,13 @@ static void __ast_change_name_nolink(struct ast_channel *chan, const char *newna void ast_change_name(struct ast_channel *chan, const char *newname) { /* We must re-link, as the hash value will change here. */ - ao2_unlink(channels, chan); + ao2_lock(channels); ast_channel_lock(chan); + ao2_unlink(channels, chan); __ast_change_name_nolink(chan, newname); - ast_channel_unlock(chan); ao2_link(channels, chan); + ast_channel_unlock(chan); + ao2_unlock(channels); } void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child) @@ -6382,8 +6384,7 @@ static void clone_variables(struct ast_channel *original, struct ast_channel *cl struct ast_var_t *current, *newvar; /* Append variables from clone channel into original channel */ /* XXX Is this always correct? We have to in order to keep MACROS working XXX */ - if (AST_LIST_FIRST(&clonechan->varshead)) - AST_LIST_APPEND_LIST(&original->varshead, &clonechan->varshead, entries); + AST_LIST_APPEND_LIST(&original->varshead, &clonechan->varshead, entries); /* then, dup the varshead list into the clone */