[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