[asterisk-commits] rmudgett: branch 1.6.2 r206373 - in /branches/1.6.2: ./ channels/ channels/mi...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Jul 13 20:59:29 CDT 2009


Author: rmudgett
Date: Mon Jul 13 20:59:25 2009
New Revision: 206373

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=206373
Log:
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
  ........
................

Modified:
    branches/1.6.2/   (props changed)
    branches/1.6.2/channels/chan_misdn.c
    branches/1.6.2/channels/misdn/isdn_lib.c

Propchange: branches/1.6.2/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.2/channels/chan_misdn.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.2/channels/chan_misdn.c?view=diff&rev=206373&r1=206372&r2=206373
==============================================================================
--- branches/1.6.2/channels/chan_misdn.c (original)
+++ branches/1.6.2/channels/chan_misdn.c Mon Jul 13 20:59:25 2009
@@ -433,21 +433,16 @@
 } *robin = NULL;
 
 
-static inline void free_robin_list_r(struct robin_list *r)
-{
-	if (r) {
-		if (r->next)
-			free_robin_list_r(r->next);
-		if (r->group)
-			ast_free(r->group);
+static void free_robin_list(void)
+{
+	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) 
@@ -460,7 +455,14 @@
 		}
 	}
 	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 @@
 {
 	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 = init_chan_list(ORG_AST);
-
-	snprintf(buf, sizeof(buf), "%s/%s", misdn_type, (char*)data);
+	struct chan_list *cl;
+
+	snprintf(dial_str, sizeof(dial_str), "%s/%s", misdn_type, (char*)data);
 
 	port_str = strtok_r(buf2, "/", &tokb);
 
@@ -3610,10 +3611,16 @@
 	
 
 	/* 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 @@
 		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 @@
 	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 @@
 	}
 	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 @@
 	}
 	*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 @@
 	}
 
 	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;

Modified: branches/1.6.2/channels/misdn/isdn_lib.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.2/channels/misdn/isdn_lib.c?view=diff&rev=206373&r1=206372&r2=206373
==============================================================================
--- branches/1.6.2/channels/misdn/isdn_lib.c (original)
+++ branches/1.6.2/channels/misdn/isdn_lib.c Mon Jul 13 20:59:25 2009
@@ -2875,9 +2875,11 @@
 
 	case DL_ESTABLISH | REQUEST:
 		cb_log(1,stack->port,"DL_ESTABLISH|REQUEST \n");
+		free_msg(msg);
 		return 1;
 	case DL_RELEASE | REQUEST:
 		cb_log(1,stack->port,"DL_RELEASE|REQUEST \n");
+		free_msg(msg);
 		return 1;
 		
 	case DL_ESTABLISH | INDICATION:
@@ -3946,7 +3948,7 @@
 				free_msg(msg);	
 				break;
 			case MGR_SETSTACK | REQUEST :
-				/* Warning: memory leak here if we get this message */
+				free_msg(msg);
 				break;
 			default:
 				mISDN_write(glob_mgr->midev, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC);




More information about the asterisk-commits mailing list