mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-04 05:15:22 +00:00 
			
		
		
		
	Handle group memberships better with masquerade (bug #3067)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4633 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										45
									
								
								channel.c
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								channel.c
									
									
									
									
									
								
							@@ -39,6 +39,7 @@
 | 
			
		||||
#include <asterisk/causes.h>
 | 
			
		||||
#include <asterisk/utils.h>
 | 
			
		||||
#include <asterisk/lock.h>
 | 
			
		||||
#include <asterisk/app.h>
 | 
			
		||||
#ifdef ZAPTEL_OPTIMIZATIONS
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#ifdef __linux__
 | 
			
		||||
@@ -2242,12 +2243,42 @@ void ast_change_name(struct ast_channel *chan, char *newname)
 | 
			
		||||
	manager_event(EVENT_FLAG_CALL, "Rename", "Oldname: %s\r\nNewname: %s\r\nUniqueid: %s\r\n", tmp, chan->name, chan->uniqueid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Clone channel variables from 'clone' channel into 'original' channel
 | 
			
		||||
   All variables except those related to app_groupcount are cloned
 | 
			
		||||
   Variables are actually _removed_ from 'clone' channel, presumably
 | 
			
		||||
   because it will subsequently be destroyed.
 | 
			
		||||
   Assumes locks will be in place on both channels when called.
 | 
			
		||||
*/
 | 
			
		||||
   
 | 
			
		||||
static void clone_variables(struct ast_channel *original, struct ast_channel *clone)
 | 
			
		||||
{
 | 
			
		||||
	struct ast_var_t *varptr;
 | 
			
		||||
 | 
			
		||||
	/* we need to remove all app_groupcount related variables from the original
 | 
			
		||||
	   channel before merging in the clone's variables; any groups assigned to the
 | 
			
		||||
	   original channel should be released, only those assigned to the clone
 | 
			
		||||
	   should remain
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	AST_LIST_TRAVERSE_SAFE_BEGIN(&original->varshead, varptr, entries) {
 | 
			
		||||
		if (!strncmp(ast_var_name(varptr), GROUP_CATEGORY_PREFIX, strlen(GROUP_CATEGORY_PREFIX))) {
 | 
			
		||||
			AST_LIST_REMOVE(&original->varshead, varptr, entries);
 | 
			
		||||
			ast_var_delete(varptr);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	AST_LIST_TRAVERSE_SAFE_END;
 | 
			
		||||
 | 
			
		||||
	/* Append variables from clone channel into original channel */
 | 
			
		||||
	/* XXX Is this always correct?  We have to in order to keep MACROS working XXX */
 | 
			
		||||
	AST_LIST_INSERT_TAIL(&original->varshead, AST_LIST_FIRST(&clone->varshead), entries);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Assumes channel will be locked when called */
 | 
			
		||||
int ast_do_masquerade(struct ast_channel *original)
 | 
			
		||||
{
 | 
			
		||||
	int x,i;
 | 
			
		||||
	int res=0;
 | 
			
		||||
	int origstate;
 | 
			
		||||
	struct ast_var_t *varptr;
 | 
			
		||||
	struct ast_frame *cur, *prev;
 | 
			
		||||
	struct ast_channel_pvt *p;
 | 
			
		||||
	struct ast_callerid tmpcid;
 | 
			
		||||
@@ -2364,17 +2395,7 @@ int ast_do_masquerade(struct ast_channel *original)
 | 
			
		||||
	for (x=0;x<AST_MAX_FDS;x++) {
 | 
			
		||||
		original->fds[x] = clone->fds[x];
 | 
			
		||||
	}
 | 
			
		||||
	/* Append variables from clone channel into original channel */
 | 
			
		||||
	/* XXX Is this always correct?  We have to in order to keep MACROS working XXX */
 | 
			
		||||
	varptr = original->varshead.first;
 | 
			
		||||
	if (varptr) {
 | 
			
		||||
		while(varptr->entries.next) {
 | 
			
		||||
			varptr = varptr->entries.next;
 | 
			
		||||
		}
 | 
			
		||||
		varptr->entries.next = clone->varshead.first;
 | 
			
		||||
	} else {
 | 
			
		||||
		original->varshead.first = clone->varshead.first;
 | 
			
		||||
	}
 | 
			
		||||
	clone_variables(original, clone);
 | 
			
		||||
	clone->varshead.first = NULL;
 | 
			
		||||
	/* Presense of ADSI capable CPE follows clone */
 | 
			
		||||
	original->adsicpe = clone->adsicpe;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user