[Asterisk-cvs] asterisk cdr.c,1.43,1.44

markster at lists.digium.com markster at lists.digium.com
Thu Jun 16 20:36:24 CDT 2005


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv27335

Modified Files:
	cdr.c 
Log Message:
Fix reset cdr (bug #4531)


Index: cdr.c
===================================================================
RCS file: /usr/cvsroot/asterisk/cdr.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -d -r1.43 -r1.44
--- cdr.c	15 Jun 2005 15:01:40 -0000	1.43
+++ cdr.c	17 Jun 2005 00:37:43 -0000	1.44
@@ -147,6 +147,22 @@
 	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) 
 {
 	struct ast_var_t *variables;
@@ -800,14 +816,15 @@
 	struct ast_flags tmp = {flags};
 	struct ast_cdr *dup;
 
+
 	while (cdr) {
 		/* 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_POSTED)) {
 				ast_cdr_end(cdr);
-				dup = ast_cdr_alloc();
-				memcpy(dup, cdr, sizeof(*dup));
-				ast_cdr_detach(dup);
+				if ((dup = ast_cdr_dup(cdr))) {
+					ast_cdr_detach(dup);
+				}
 				ast_set_flag(cdr, AST_CDR_FLAG_POSTED);
 			}
 




More information about the svn-commits mailing list