diff --git a/channel.c b/channel.c index 5a3afcf2ab..10ef85fc2f 100644 --- a/channel.c +++ b/channel.c @@ -2940,10 +2940,20 @@ void ast_channel_inherit_variables(const struct ast_channel *parent, struct ast_ static void clone_variables(struct ast_channel *original, struct ast_channel *clone) { + 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(&clone->varshead)) AST_LIST_APPEND_LIST(&original->varshead, &clone->varshead, entries); + AST_LIST_HEAD_INIT_NOLOCK(&clone->varshead); + + /* then, dup the varshead list into the clone */ + + AST_LIST_TRAVERSE(&original->varshead, current, entries) { + newvar = ast_var_assign(current->name, current->value); + if (newvar) + AST_LIST_INSERT_TAIL(&clone->varshead, newvar, entries); + } } /*--- ast_do_masquerade: Masquerade a channel */ @@ -3125,7 +3135,6 @@ int ast_do_masquerade(struct ast_channel *original) /* Drop group from original */ ast_app_group_update(clone, original); clone_variables(original, clone); - AST_LIST_HEAD_INIT_NOLOCK(&clone->varshead); /* Presense of ADSI capable CPE follows clone */ original->adsicpe = clone->adsicpe; /* Bridge remains the same */