diff --git a/cdr.c b/cdr.c index d481282..93ebfc6 100644 --- a/cdr.c +++ b/cdr.c @@ -8,7 +8,7 @@ #include "mediator.h" static int cdr_create_cdrs(med_entry_t *records, uint64_t count, - cdr_entry_t **cdrs, uint64_t *cdr_count, uint8_t *trash, int do_intermediate); + cdr_entry_t **cdrs, uint64_t *cdr_count, uint64_t *alloc_size, uint8_t *trash, int do_intermediate); static const char* cdr_map_status(const char *sip_status) { @@ -40,6 +40,13 @@ static const char* cdr_map_status(const char *sip_status) return CDR_STATUS_UNKNOWN; } + +static void free_cdrs(cdr_entry_t **cdrs, uint64_t cdr_count) { + g_free(*cdrs); + *cdrs = NULL; +} + + int cdr_process_records(med_entry_t *records, uint64_t count, uint64_t *ext_count, struct medmysql_batches *batches, int do_intermediate) { @@ -58,7 +65,7 @@ int cdr_process_records(med_entry_t *records, uint64_t count, uint64_t *ext_coun cdr_entry_t *cdrs = NULL; - uint64_t cdr_count; + uint64_t cdr_count, alloc_size = 0; *ext_count = 0; @@ -118,7 +125,7 @@ int cdr_process_records(med_entry_t *records, uint64_t count, uint64_t *ext_coun } else { - if(cdr_create_cdrs(records, count, &cdrs, &cdr_count, &trash, do_intermediate) != 0) + if(cdr_create_cdrs(records, count, &cdrs, &cdr_count, &alloc_size, &trash, do_intermediate) != 0) goto error; else { @@ -164,7 +171,7 @@ int cdr_process_records(med_entry_t *records, uint64_t count, uint64_t *ext_coun { /* TODO: no CDRs created? */ } - free(cdrs); + free_cdrs(&cdrs, alloc_size); cdrs = NULL; } } @@ -202,7 +209,7 @@ int cdr_process_records(med_entry_t *records, uint64_t count, uint64_t *ext_coun error: if(cdrs) - free(cdrs); + free_cdrs(&cdrs, alloc_size); return -1; } @@ -1346,12 +1353,20 @@ err: } +static cdr_entry_t *alloc_cdrs(uint64_t cdr_count) { + cdr_entry_t *cdrs = g_malloc0(sizeof(*cdrs) * cdr_count); + if (!cdrs) + return NULL; + + return cdrs; +} + + static int cdr_create_cdrs(med_entry_t *records, uint64_t count, - cdr_entry_t **cdrs, uint64_t *cdr_count, uint8_t *trash, int do_intermediate) + cdr_entry_t **cdrs, uint64_t *cdr_count, uint64_t *alloc_size, uint8_t *trash, int do_intermediate) { uint64_t i = 0, cdr_index = 0; - uint32_t invites = 0; - size_t cdr_size; + uint64_t invites = 0; int timed_out = 0; char *endtime = NULL; @@ -1396,14 +1411,13 @@ static int cdr_create_cdrs(med_entry_t *records, uint64_t count, } /* each INVITE maps to a CDR */ - cdr_size = sizeof(cdr_entry_t) * invites; - *cdrs = (cdr_entry_t*)malloc(cdr_size); + *cdrs = alloc_cdrs(invites); if(*cdrs == NULL) { L_ERROR("Error allocating memory for cdrs: %s", strerror(errno)); return -1; } - memset(*cdrs, 0, cdr_size); + *alloc_size = invites; for(i = 0; i < count; ++i) {