[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