[Asterisk-cvs] asterisk translate.c,1.40,1.41

russell at lists.digium.com russell at lists.digium.com
Mon Jul 25 15:03:57 CDT 2005


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv16056

Modified Files:
	translate.c 
Log Message:
get rid of potential memory leak


Index: translate.c
===================================================================
RCS file: /usr/cvsroot/asterisk/translate.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- translate.c	15 Jul 2005 23:00:46 -0000	1.40
+++ translate.c	25 Jul 2005 19:10:38 -0000	1.41
@@ -89,49 +89,52 @@
 	}
 }
 
+/* Build a set of translators based upon the given source and destination formats */
 struct ast_trans_pvt *ast_translator_build_path(int dest, int source)
 {
 	struct ast_trans_pvt *tmpr = NULL, *tmp = NULL;
-	/* One of the hardest parts:  Build a set of translators based upon
-	   the given source and destination formats */
+	
 	source = powerof(source);
 	dest = powerof(dest);
+	
 	while(source != dest) {
-		if (tr_matrix[source][dest].step) {
-			if (tmp) {
-				tmp->next = malloc(sizeof(struct ast_trans_pvt));
-				tmp = tmp->next;
-			} else
-				tmp = malloc(sizeof(struct ast_trans_pvt));
-
-				
-			if (tmp) {
-				tmp->next = NULL;
-				tmp->nextin = tmp->nextout = ast_tv( 0, 0 );
-				tmp->step = tr_matrix[source][dest].step;
-				tmp->state = tmp->step->newpvt();
-				if (!tmp->state) {
-					ast_log(LOG_WARNING, "Failed to build translator step from %d to %d\n", source, dest);
-					free(tmp);
-					tmp = NULL;
-					return NULL;
-				}
-				/* Set the root, if it doesn't exist yet... */
-				if (!tmpr)
-					tmpr = tmp;
-				/* Keep going if this isn't the final destination */
-				source = tmp->step->dstfmt;
-			} else {
-				/* XXX This could leak XXX */
-				ast_log(LOG_WARNING, "Out of memory\n");
-				return NULL;
-			}
-		} else {
+		if (!tr_matrix[source][dest].step) {
 			/* We shouldn't have allocated any memory */
 			ast_log(LOG_WARNING, "No translator path from %s to %s\n", 
 				ast_getformatname(source), ast_getformatname(dest));
 			return NULL;
 		}
+
+		if (tmp) {
+			tmp->next = malloc(sizeof(*tmp));
+			tmp = tmp->next;
+		} else
+			tmp = malloc(sizeof(*tmp));
+			
+		if (!tmp) {
+			ast_log(LOG_WARNING, "Out of memory\n");
+			if (tmpr)
+				ast_translator_free_path(tmpr);	
+			return NULL;
+		}
+
+		/* Set the root, if it doesn't exist yet... */
+		if (!tmpr)
+			tmpr = tmp;
+
+		tmp->next = NULL;
+		tmp->nextin = tmp->nextout = ast_tv(0, 0);
+		tmp->step = tr_matrix[source][dest].step;
+		tmp->state = tmp->step->newpvt();
+		
+		if (!tmp->state) {
+			ast_log(LOG_WARNING, "Failed to build translator step from %d to %d\n", source, dest);
+			ast_translator_free_path(tmpr);	
+			return NULL;
+		}
+		
+		/* Keep going if this isn't the final destination */
+		source = tmp->step->dstfmt;
 	}
 	return tmpr;
 }




More information about the svn-commits mailing list