* Made ast_change_name() hold the channels container lock while changing the channel...
authorRichard Mudgett <rmudgett@digium.com>
Thu, 10 May 2012 23:49:07 +0000 (23:49 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 10 May 2012 23:49:07 +0000 (23:49 +0000)
* Eliminate redundant list not empty check in clone_variables().
........

Merged revisions 366240 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 366241 from http://svn.asterisk.org/svn/asterisk/branches/10

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@366242 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/channel.c

index c00ffb5..dfb31e1 100644 (file)
@@ -6167,11 +6167,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. */
 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);
        ast_channel_lock(chan);
+       ao2_unlink(channels, chan);
        __ast_change_name_nolink(chan, newname);
        __ast_change_name_nolink(chan, newname);
-       ast_channel_unlock(chan);
        ao2_link(channels, 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)
 }
 
 void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_channel *child)
@@ -6228,8 +6230,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 */
        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(ast_channel_varshead(clonechan)))
-               AST_LIST_APPEND_LIST(ast_channel_varshead(original), ast_channel_varshead(clonechan), entries);
+       AST_LIST_APPEND_LIST(ast_channel_varshead(original), ast_channel_varshead(clonechan), entries);
 
        /* then, dup the varshead list into the clone */
 
 
        /* then, dup the varshead list into the clone */