diff options
author | rmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-14 01:59:25 +0000 |
---|---|---|
committer | rmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-07-14 01:59:25 +0000 |
commit | 30f3a00c827f5645ada2d110823205aaa6de9365 (patch) | |
tree | 246108d400218c42340044bd5fe33ee3b637589a /channels/chan_misdn.c | |
parent | 8862b81856d3a9d6733d386bfd4ceb3621bbd36f (diff) |
Merged revisions 206341 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
................
r206341 | rmudgett | 2009-07-13 19:48:59 -0500 (Mon, 13 Jul 2009) | 11 lines
Merged revisions 206284 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r206284 | rmudgett | 2009-07-13 19:17:28 -0500 (Mon, 13 Jul 2009) | 4 lines
Fix some memory leaks in chan_misdn.
JIRA ABE-1911
........
................
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.2@206373 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_misdn.c')
-rw-r--r-- | channels/chan_misdn.c | 76 |
1 files changed, 52 insertions, 24 deletions
diff --git a/channels/chan_misdn.c b/channels/chan_misdn.c index ec026e526..c278884b9 100644 --- a/channels/chan_misdn.c +++ b/channels/chan_misdn.c @@ -433,23 +433,18 @@ static struct robin_list { } *robin = NULL; -static inline void free_robin_list_r(struct robin_list *r) +static void free_robin_list(void) { - if (r) { - if (r->next) - free_robin_list_r(r->next); - if (r->group) - ast_free(r->group); + struct robin_list *r; + struct robin_list *next; + + for (r = robin, robin = NULL; r; r = next) { + next = r->next; + ast_free(r->group); ast_free(r); } } -static void free_robin_list(void) -{ - free_robin_list_r(robin); - robin = NULL; -} - static struct robin_list* get_robin_position(char *group) { struct robin_list *new; @@ -460,7 +455,14 @@ static struct robin_list* get_robin_position(char *group) } } new = ast_calloc(1, sizeof(*new)); - new->group = strdup(group); + if (!new) { + return NULL; + } + new->group = ast_strdup(group); + if (!new->group) { + ast_free(new); + return NULL; + } new->channel = 1; if (robin) { new->next = robin; @@ -3454,16 +3456,15 @@ static struct ast_channel *misdn_request(const char *type, int format, void *dat { struct ast_channel *tmp = NULL; char group[BUFFERSIZE + 1] = ""; - char buf[128]; + char dial_str[128]; char *buf2 = ast_strdupa(data), *ext = NULL, *port_str; char *tokb = NULL, *p = NULL; int channel = 0, port = 0; struct misdn_bchannel *newbc = NULL; int dec = 0; + struct chan_list *cl; - struct chan_list *cl = init_chan_list(ORG_AST); - - snprintf(buf, sizeof(buf), "%s/%s", misdn_type, (char*)data); + snprintf(dial_str, sizeof(dial_str), "%s/%s", misdn_type, (char*)data); port_str = strtok_r(buf2, "/", &tokb); @@ -3610,10 +3611,16 @@ static struct ast_channel *misdn_request(const char *type, int format, void *dat /* create ast_channel and link all the objects together */ + cl = init_chan_list(ORG_AST); + if (!cl) { + ast_log(LOG_ERROR, "Could not create call record for Dial(%s)\n", dial_str); + return NULL; + } cl->bc = newbc; tmp = misdn_new(cl, AST_STATE_RESERVED, ext, NULL, format, port, channel); if (!tmp) { + ast_free(cl); ast_log(LOG_ERROR, "Could not create Asterisk object\n"); return NULL; } @@ -4545,6 +4552,7 @@ cb_events(enum event_e event, struct misdn_bchannel *bc, void *user_data) chan = misdn_new(ch, AST_STATE_RESERVED, bc->dad, bc->oad, AST_FORMAT_ALAW, bc->port, bc->channel); if (!chan) { + ast_free(ch); misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); ast_log(LOG_ERROR, "cb_events: misdn_new failed !\n"); return 0; @@ -5281,13 +5289,11 @@ static int unload_module(void) misdn_cfg_destroy(); misdn_lib_destroy(); - if (misdn_debug) { - ast_free(misdn_debug); - } - if (misdn_debug_only) { - ast_free(misdn_debug_only); - } - ast_free(misdn_ports); + ast_free(misdn_out_calls); + ast_free(misdn_in_calls); + ast_free(misdn_debug_only); + ast_free(misdn_ports); + ast_free(misdn_debug); return 0; } @@ -5325,6 +5331,7 @@ static int load_module(void) } misdn_ports = ast_malloc(sizeof(int) * (max_ports + 1)); if (!misdn_ports) { + ast_free(misdn_debug); ast_log(LOG_ERROR, "Out of memory for misdn_ports\n"); return AST_MODULE_LOAD_DECLINE; } @@ -5335,6 +5342,12 @@ static int load_module(void) } *misdn_ports = 0; misdn_debug_only = ast_calloc(max_ports + 1, sizeof(int)); + if (!misdn_debug_only) { + ast_free(misdn_ports); + ast_free(misdn_debug); + ast_log(LOG_ERROR, "Out of memory for misdn_debug_only\n"); + return AST_MODULE_LOAD_DECLINE; + } misdn_cfg_get(0, MISDN_GEN_TRACEFILE, tempbuf, sizeof(tempbuf)); if (!ast_strlen_zero(tempbuf)) { @@ -5342,7 +5355,22 @@ static int load_module(void) } misdn_in_calls = ast_malloc(sizeof(int) * (max_ports + 1)); + if (!misdn_in_calls) { + ast_free(misdn_debug_only); + ast_free(misdn_ports); + ast_free(misdn_debug); + ast_log(LOG_ERROR, "Out of memory for misdn_in_calls\n"); + return AST_MODULE_LOAD_DECLINE; + } misdn_out_calls = ast_malloc(sizeof(int) * (max_ports + 1)); + if (!misdn_out_calls) { + ast_free(misdn_in_calls); + ast_free(misdn_debug_only); + ast_free(misdn_ports); + ast_free(misdn_debug); + ast_log(LOG_ERROR, "Out of memory for misdn_out_calls\n"); + return AST_MODULE_LOAD_DECLINE; + } for (i = 1; i <= max_ports; i++) { misdn_in_calls[i] = 0; |