aboutsummaryrefslogtreecommitdiffstats
path: root/cdr.c
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-17 00:37:43 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-17 00:37:43 +0000
commita938fdd1ebe5ac64573e0045d4bb335d4d9f7be9 (patch)
tree314be70742b1ce26fedf8e88569075ace56a9a1c /cdr.c
parent8698db8b5da2eca74fb04b02e86a742fab4d500f (diff)
Fix reset cdr (bug #4531)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5920 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'cdr.c')
-rwxr-xr-xcdr.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/cdr.c b/cdr.c
index e04188afa..bdac2fb57 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);
}