mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-29 15:36:13 +00:00 
			
		
		
		
	Fix reset cdr (bug #4531)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5920 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		
							
								
								
									
										23
									
								
								cdr.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								cdr.c
									
									
									
									
									
								
							| @@ -147,6 +147,22 @@ void ast_cdr_unregister(char *name) | |||||||
| 	AST_LIST_UNLOCK(&be_list); | 	AST_LIST_UNLOCK(&be_list); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static struct ast_cdr *ast_cdr_dup(struct ast_cdr *cdr)  | ||||||
|  | { | ||||||
|  | 	struct ast_cdr *newcdr = NULL; | ||||||
|  |  | ||||||
|  | 	if (!(newcdr = ast_cdr_alloc())) { | ||||||
|  | 		ast_log(LOG_ERROR, "Memory Error!\n"); | ||||||
|  | 	} else { | ||||||
|  | 		memcpy(newcdr,cdr,sizeof(struct ast_cdr)); | ||||||
|  | 		/* The varshead is unusable, volatile even, after the memcpy so we take care of that here */ | ||||||
|  | 		memset(&newcdr->varshead, 0, sizeof(newcdr->varshead)); | ||||||
|  | 		ast_cdr_copy_vars(newcdr, cdr); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return newcdr; | ||||||
|  | } | ||||||
|  |  | ||||||
| static const char *ast_cdr_getvar_internal(struct ast_cdr *cdr, const char *name, int recur)  | static const char *ast_cdr_getvar_internal(struct ast_cdr *cdr, const char *name, int recur)  | ||||||
| { | { | ||||||
| 	struct ast_var_t *variables; | 	struct ast_var_t *variables; | ||||||
| @@ -800,14 +816,15 @@ void ast_cdr_reset(struct ast_cdr *cdr, int flags) | |||||||
| 	struct ast_flags tmp = {flags}; | 	struct ast_flags tmp = {flags}; | ||||||
| 	struct ast_cdr *dup; | 	struct ast_cdr *dup; | ||||||
|  |  | ||||||
|  |  | ||||||
| 	while (cdr) { | 	while (cdr) { | ||||||
| 		/* Detach if post is requested */ | 		/* Detach if post is requested */ | ||||||
| 		if (ast_test_flag(&tmp, AST_CDR_FLAG_LOCKED) || !ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) { | 		if (ast_test_flag(&tmp, AST_CDR_FLAG_LOCKED) || !ast_test_flag(cdr, AST_CDR_FLAG_LOCKED)) { | ||||||
| 			if (ast_test_flag(&tmp, AST_CDR_FLAG_POSTED)) { | 			if (ast_test_flag(&tmp, AST_CDR_FLAG_POSTED)) { | ||||||
| 				ast_cdr_end(cdr); | 				ast_cdr_end(cdr); | ||||||
| 				dup = ast_cdr_alloc(); | 				if ((dup = ast_cdr_dup(cdr))) { | ||||||
| 				memcpy(dup, cdr, sizeof(*dup)); | 					ast_cdr_detach(dup); | ||||||
| 				ast_cdr_detach(dup); | 				} | ||||||
| 				ast_set_flag(cdr, AST_CDR_FLAG_POSTED); | 				ast_set_flag(cdr, AST_CDR_FLAG_POSTED); | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user