get rid of potential memory leak
authorRussell Bryant <russell@russellbryant.com>
Mon, 25 Jul 2005 19:10:38 +0000 (19:10 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 25 Jul 2005 19:10:38 +0000 (19:10 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6199 65c4cc65-6c06-0410-ace0-fbb531ad65f3

translate.c

index 2ea1d87..b53ea25 100755 (executable)
@@ -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;
 }