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: https://origsvn.digium.com/svn/asterisk/branches/1.6.1@206372 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.6.1
Richard Mudgett 16 years ago
parent 6de099e16c
commit 8b32297490

@ -430,33 +430,36 @@ static struct ast_frame *process_ast_dsp(struct chan_list *tmp, struct ast_frame
static inline void free_robin_list_r (struct robin_list *r) static void free_robin_list(void)
{ {
if (r) { struct robin_list *r;
if (r->next) struct robin_list *next;
free_robin_list_r(r->next);
if (r->group) for (r = robin, robin = NULL; r; r = next) {
ast_free(r->group); next = r->next;
ast_free(r->group);
ast_free(r); 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) static struct robin_list* get_robin_position (char *group)
{ {
struct robin_list *new; struct robin_list *new;
struct robin_list *iter = robin; struct robin_list *iter = robin;
for (; iter; iter = iter->next) { for (; iter; iter = iter->next) {
if (!strcasecmp(iter->group, group)) if (!strcasecmp(iter->group, group)) {
return iter; return iter;
}
} }
new = ast_calloc(1, sizeof(*new)); new = ast_calloc(1, sizeof(*new));
new->group = strndup(group, strlen(group)); if (!new) {
return NULL;
}
new->group = ast_strdup(group);
if (!new->group) {
ast_free(new);
return NULL;
}
new->channel = 1; new->channel = 1;
if (robin) { if (robin) {
new->next = robin; new->next = robin;
@ -3386,16 +3389,15 @@ static struct ast_channel *misdn_request(const char *type, int format, void *dat
{ {
struct ast_channel *tmp = NULL; struct ast_channel *tmp = NULL;
char group[BUFFERSIZE + 1] = ""; char group[BUFFERSIZE + 1] = "";
char buf[128]; char dial_str[128];
char *buf2 = ast_strdupa(data), *ext = NULL, *port_str; char *buf2 = ast_strdupa(data), *ext = NULL, *port_str;
char *tokb = NULL, *p = NULL; char *tokb = NULL, *p = NULL;
int channel = 0, port = 0; int channel = 0, port = 0;
struct misdn_bchannel *newbc = NULL; struct misdn_bchannel *newbc = NULL;
int dec = 0; int dec = 0;
struct chan_list *cl;
struct chan_list *cl = init_chan_list(ORG_AST); snprintf(dial_str, sizeof(dial_str), "%s/%s", misdn_type, (char*)data);
snprintf(buf, sizeof(buf), "%s/%s", misdn_type, (char*)data);
port_str = strtok_r(buf2, "/", &tokb); port_str = strtok_r(buf2, "/", &tokb);
@ -3538,10 +3540,16 @@ static struct ast_channel *misdn_request(const char *type, int format, void *dat
/* create ast_channel and link all the objects together */ /* 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; cl->bc = newbc;
tmp = misdn_new(cl, AST_STATE_RESERVED, ext, NULL, format, port, channel); tmp = misdn_new(cl, AST_STATE_RESERVED, ext, NULL, format, port, channel);
if (!tmp) { if (!tmp) {
ast_free(cl);
ast_log(LOG_ERROR,"Could not create Asterisk object\n"); ast_log(LOG_ERROR,"Could not create Asterisk object\n");
return NULL; return NULL;
} }
@ -4469,6 +4477,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); chan = misdn_new(ch, AST_STATE_RESERVED, bc->dad, bc->oad, AST_FORMAT_ALAW, bc->port, bc->channel);
if (!chan) { if (!chan) {
ast_free(ch);
misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE); misdn_lib_send_event(bc,EVENT_RELEASE_COMPLETE);
ast_log(LOG_ERROR, "cb_events: misdn_new failed !\n"); ast_log(LOG_ERROR, "cb_events: misdn_new failed !\n");
return 0; return 0;
@ -5235,11 +5244,11 @@ static int unload_module(void)
misdn_cfg_destroy(); misdn_cfg_destroy();
misdn_lib_destroy(); misdn_lib_destroy();
if (misdn_debug) ast_free(misdn_out_calls);
ast_free(misdn_debug); ast_free(misdn_in_calls);
if (misdn_debug_only) ast_free(misdn_debug_only);
ast_free(misdn_debug_only); ast_free(misdn_ports);
ast_free(misdn_ports); ast_free(misdn_debug);
return 0; return 0;
} }
@ -5277,6 +5286,7 @@ static int load_module(void)
} }
misdn_ports = ast_malloc(sizeof(int) * (max_ports + 1)); misdn_ports = ast_malloc(sizeof(int) * (max_ports + 1));
if (!misdn_ports) { if (!misdn_ports) {
ast_free(misdn_debug);
ast_log(LOG_ERROR, "Out of memory for misdn_ports\n"); ast_log(LOG_ERROR, "Out of memory for misdn_ports\n");
return AST_MODULE_LOAD_DECLINE; return AST_MODULE_LOAD_DECLINE;
} }
@ -5287,13 +5297,34 @@ static int load_module(void)
} }
*misdn_ports = 0; *misdn_ports = 0;
misdn_debug_only = ast_calloc(max_ports + 1, sizeof(int)); 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)); misdn_cfg_get(0, MISDN_GEN_TRACEFILE, tempbuf, sizeof(tempbuf));
if (!ast_strlen_zero(tempbuf)) if (!ast_strlen_zero(tempbuf))
tracing = 1; tracing = 1;
misdn_in_calls = ast_malloc(sizeof(int) * (max_ports + 1)); 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)); 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++) { for (i = 1; i <= max_ports; i++) {
misdn_in_calls[i] = 0; misdn_in_calls[i] = 0;

@ -2851,9 +2851,11 @@ static int handle_l2(msg_t *msg)
case DL_ESTABLISH | REQUEST: case DL_ESTABLISH | REQUEST:
cb_log(1,stack->port,"DL_ESTABLISH|REQUEST \n"); cb_log(1,stack->port,"DL_ESTABLISH|REQUEST \n");
free_msg(msg);
return 1; return 1;
case DL_RELEASE | REQUEST: case DL_RELEASE | REQUEST:
cb_log(1,stack->port,"DL_RELEASE|REQUEST \n"); cb_log(1,stack->port,"DL_RELEASE|REQUEST \n");
free_msg(msg);
return 1; return 1;
case DL_ESTABLISH | INDICATION: case DL_ESTABLISH | INDICATION:
@ -3898,6 +3900,7 @@ static void manager_event_handler(void *arg)
free_msg(msg); free_msg(msg);
break; break;
case MGR_SETSTACK | REQUEST : case MGR_SETSTACK | REQUEST :
free_msg(msg);
break; break;
default: default:
mISDN_write(glob_mgr->midev, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC); mISDN_write(glob_mgr->midev, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC);

Loading…
Cancel
Save