get rid of potential memory leak

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6199 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Russell Bryant 20 years ago
parent 6074f3441a
commit f34930313c

@ -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 *ast_translator_build_path(int dest, int source)
{ {
struct ast_trans_pvt *tmpr = NULL, *tmp = NULL; 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); source = powerof(source);
dest = powerof(dest); dest = powerof(dest);
while(source != dest) { while(source != dest) {
if (tr_matrix[source][dest].step) { 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 {
/* We shouldn't have allocated any memory */ /* We shouldn't have allocated any memory */
ast_log(LOG_WARNING, "No translator path from %s to %s\n", ast_log(LOG_WARNING, "No translator path from %s to %s\n",
ast_getformatname(source), ast_getformatname(dest)); ast_getformatname(source), ast_getformatname(dest));
return NULL; 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; return tmpr;
} }

Loading…
Cancel
Save