aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_misdn.c
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-14 01:59:25 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-07-14 01:59:25 +0000
commit30f3a00c827f5645ada2d110823205aaa6de9365 (patch)
tree246108d400218c42340044bd5fe33ee3b637589a /channels/chan_misdn.c
parent8862b81856d3a9d6733d386bfd4ceb3621bbd36f (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.c76
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;