From ac4ac37df14db201b6a92cc47a03876d58c63610 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Fri, 17 Jun 2005 00:37:43 +0000
Subject: [PATCH] Fix reset cdr (bug #4531)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5920 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 cdr.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

diff --git a/cdr.c b/cdr.c
index e04188afa7..bdac2fb577 100755
--- a/cdr.c
+++ b/cdr.c
@@ -147,6 +147,22 @@ void ast_cdr_unregister(char *name)
 	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 @@ void ast_cdr_reset(struct ast_cdr *cdr, int flags)
 	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);
 			}
 
-- 
GitLab