dect
/
asterisk
Archived
13
0
Fork 0

get rid of potential memory leak

git-svn-id: http://svn.digium.com/svn/asterisk/trunk@6199 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
russell 2005-07-25 19:10:38 +00:00
parent 8e93280ca4
commit 2dbd70cd4d
1 changed files with 35 additions and 32 deletions

View File

@ -89,49 +89,52 @@ void ast_translator_free_path(struct ast_trans_pvt *p)
}
}
/* 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;
}