From: Joshua Colp Date: Mon, 7 May 2007 21:39:52 +0000 (+0000) Subject: Properly handle what happens during a masquerade in relation to group counting. ... X-Git-Tag: 1.2.19~64 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71befa9884eaab7260614c3214e1b33fc7da1384;p=thirdparty%2Fasterisk.git Properly handle what happens during a masquerade in relation to group counting. (issue #9657 reported by ramonpeek) git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@63285 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/app.c b/app.c index dd4a1853bf..f997752480 100644 --- a/app.c +++ b/app.c @@ -1113,6 +1113,20 @@ int ast_app_group_match_get_count(char *groupmatch, char *category) return count; } +int ast_app_group_update(struct ast_channel *old, struct ast_channel *new) +{ + struct ast_group_info *gi = NULL; + + AST_LIST_LOCK(&groups); + AST_LIST_TRAVERSE(&groups, gi, list) { + if (gi->chan == old) + gi->chan = new; + } + AST_LIST_UNLOCK(&groups); + + return 0; +} + int ast_app_group_discard(struct ast_channel *chan) { struct ast_group_info *gi = NULL; diff --git a/channel.c b/channel.c index 55276c9ec0..4c71ce3f62 100644 --- a/channel.c +++ b/channel.c @@ -3106,7 +3106,7 @@ int ast_do_masquerade(struct ast_channel *original) original->fds[x] = clone->fds[x]; } /* Drop group from original */ - ast_app_group_discard(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 */ diff --git a/include/asterisk/app.h b/include/asterisk/app.h index b09cc8eb87..98a78d2d08 100644 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -188,6 +188,9 @@ int ast_app_group_match_get_count(char *groupmatch, char *category); /*! Discard all group counting for a channel */ int ast_app_group_discard(struct ast_channel *chan); +/*! Update all group counting for a channel to a new one */ +int ast_app_group_update(struct ast_channel *old, struct ast_channel *new); + /*! Lock the group count list */ int ast_app_group_list_lock(void);