aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authormurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-19 18:31:29 +0000
committermurf <murf@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-19 18:31:29 +0000
commit3bcef6267c9b49532fc40135671012befe5f40db (patch)
tree813d8fc889d65edaaf1394d58300e857f1811cd8 /main
parent9728b05eb110085698b71a90e1c37c4d34ec054f (diff)
Merged revisions 70062 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r70062 | murf | 2007-06-19 12:23:23 -0600 (Tue, 19 Jun 2007) | 9 lines Merged revisions 70053 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r70053 | murf | 2007-06-19 12:07:59 -0600 (Tue, 19 Jun 2007) | 1 line This fixes 9246, where channel variables are not available in the 'h' exten, on a 'ZOMBIE' channel. The fix is to consolidate the channel variables during a masquerade, and then copy the merged variables back onto the clone, so the zombie has the same vars that the 'original' has. ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@70063 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/channel.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/channel.c b/main/channel.c
index 4d6533d36..3529c1f32 100644
--- a/main/channel.c
+++ b/main/channel.c
@@ -3385,10 +3385,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);
+ }
}
/*!
@@ -3593,7 +3603,6 @@ int ast_do_masquerade(struct ast_channel *original)
AST_LIST_HEAD_INIT_NOLOCK(&clone->datastores);
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 */