[FFmpeg-devel] [PATCH] tools/graph2dot: Add proper error handling to avoid potential memory leaks

Jiasheng Jiang jiashengjiangcool at gmail.com
Sat Aug 9 06:09:53 EEST 2025


Add proper error handling to release allocated memory to avoid potential memory leaks.

Fixes: 11ab237e31 ("Add the graph2dot tools and document it.")
Signed-off-by: Jiasheng Jiang <jiashengjiangcool at gmail.com>
---
 tools/graph2dot.c | 52 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 42 insertions(+), 10 deletions(-)

diff --git a/tools/graph2dot.c b/tools/graph2dot.c
index d96bfd8126..135c1d25b1 100644
--- a/tools/graph2dot.c
+++ b/tools/graph2dot.c
@@ -114,6 +114,7 @@ int main(int argc, char **argv)
     char *graph_string      = NULL;
     AVFilterGraph *graph    = NULL;
     char c;
+    int ret = 0;
 
     av_log_set_level(AV_LOG_DEBUG);
 
@@ -148,7 +149,8 @@ int main(int argc, char **argv)
     if (!outfile) {
         fprintf(stderr, "Failed to open output file '%s': %s\n",
                 outfilename, strerror(errno));
-        return 1;
+        ret = 1;
+        goto fclose_infile;
     }
 
     /* read from infile and put it in a buffer */
@@ -159,25 +161,29 @@ int main(int argc, char **argv)
         last_line = first_line = av_malloc(sizeof(struct line));
         if (!last_line) {
             fprintf(stderr, "Memory allocation failure\n");
-            return 1;
+            ret = 1;
+            goto fclose_outfile;
         }
 
+        last_line->next = NULL;
         while (fgets(last_line->data, sizeof(last_line->data), infile)) {
             struct line *new_line = av_malloc(sizeof(struct line));
             if (!new_line) {
                 fprintf(stderr, "Memory allocation failure\n");
-                return 1;
+                ret = 1;
+                goto free_lines;
             }
             count += strlen(last_line->data);
             last_line->next = new_line;
             last_line       = new_line;
+            last_line->next = NULL;
         }
-        last_line->next = NULL;
 
         graph_string = av_malloc(count + 1);
         if (!graph_string) {
             fprintf(stderr, "Memory allocation failure\n");
-            return 1;
+            ret = 1;
+            goto free_lines;
         }
         p = graph_string;
         for (line = first_line; line->next; line = line->next) {
@@ -186,24 +192,50 @@ int main(int argc, char **argv)
             p += l;
         }
         *p = '\0';
+
+free_lines:
+        line = first_line;
+        while (line) {
+            struct line *next = line->next;
+            av_free(line);
+            line = next;
+        }
+        if (ret)
+            goto free_graph_string;
     }
 
     graph = avfilter_graph_alloc();
     if (!graph) {
         fprintf(stderr, "Memory allocation failure\n");
-        return 1;
+        ret = 1;
+        goto free_graph_string;
     }
 
     if (avfilter_graph_parse(graph, graph_string, NULL, NULL, NULL) < 0) {
         fprintf(stderr, "Failed to parse the graph description\n");
-        return 1;
+        ret = 1;
+        goto free_graph;
     }
 
-    if (avfilter_graph_config(graph, NULL) < 0)
-        return 1;
+    if (avfilter_graph_config(graph, NULL) < 0) {
+        ret = 1;
+        goto free_graph;
+    }
 
     print_digraph(outfile, graph);
     fflush(outfile);
 
-    return 0;
+    ret = 0;
+
+free_graph:
+    avfilter_graph_free(&graph);
+free_graph_string:
+    if (graph_string)
+        av_free(graph_string);
+fclose_outfile:
+    fclose(outfile);
+fclose_infile:
+    fclose(infile);
+
+    return ret;
 }
-- 
2.25.1



More information about the ffmpeg-devel mailing list