From d62c87bb8d169a29f696a1aa2b23a2267f531e7e Mon Sep 17 00:00:00 2001 From: Corey Farrell Date: Mon, 25 Dec 2017 21:39:28 -0500 Subject: cdr: Missing NULL check and unlock. * handle_dial_message: Missing a check for NULL peer. * ast_cdr_register: Missing unlock on allocation failure. ast_cdr_register is fixed by reordering so the new structure is allocated and initialized before locking the list. Change-Id: I5799b99270d1a7a716a555c31ac85f4b00ce8686 --- main/cdr.c | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/main/cdr.c b/main/cdr.c index 0b571fe0e..df5ce5497 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -2094,7 +2094,12 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str if (!peer && !caller) { return; } - if (filter_channel_snapshot(peer) || (caller && filter_channel_snapshot(caller))) { + + if (peer && filter_channel_snapshot(peer)) { + return; + } + + if (caller && filter_channel_snapshot(caller)) { return; } @@ -2868,32 +2873,39 @@ int ast_cdr_backend_unsuspend(const char *name) int ast_cdr_register(const char *name, const char *desc, ast_cdrbe be) { - struct cdr_beitem *i = NULL; + struct cdr_beitem *i; + struct cdr_beitem *cur; - if (!name) + if (!name) { return -1; + } if (!be) { ast_log(LOG_WARNING, "CDR engine '%s' lacks backend\n", name); + + return -1; + } + + i = ast_calloc(1, sizeof(*i)); + if (!i) { return -1; } + i->be = be; + ast_copy_string(i->name, name, sizeof(i->name)); + ast_copy_string(i->desc, desc, sizeof(i->desc)); + AST_RWLIST_WRLOCK(&be_list); - AST_RWLIST_TRAVERSE(&be_list, i, list) { - if (!strcasecmp(name, i->name)) { + AST_RWLIST_TRAVERSE(&be_list, cur, list) { + if (!strcasecmp(name, cur->name)) { ast_log(LOG_WARNING, "Already have a CDR backend called '%s'\n", name); AST_RWLIST_UNLOCK(&be_list); + ast_free(i); + return -1; } } - if (!(i = ast_calloc(1, sizeof(*i)))) - return -1; - - i->be = be; - ast_copy_string(i->name, name, sizeof(i->name)); - ast_copy_string(i->desc, desc, sizeof(i->desc)); - AST_RWLIST_INSERT_HEAD(&be_list, i, list); AST_RWLIST_UNLOCK(&be_list); -- cgit v1.2.3