[FFmpeg-cvslog] fftools/graph/graphprint: Fix races when initializing graphprint

Andreas Rheinhardt git at videolan.org
Mon Jun 2 01:58:19 EEST 2025


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Fri May 30 16:02:08 2025 +0200| [0742239289b0d29d219cdb1f80ff1e0a345052d4] | committer: Andreas Rheinhardt

fftools/graph/graphprint: Fix races when initializing graphprint

Setting print_graphs_format (in case no -print_graphs_format
option was specified) is racy, as is using av_strtok()
to split it. Both have been removed.

Notice that using av_strtok() was destructive: In the absence
of races the options would only have been applied for the
first initialization.

Reviewed-by: softworkz . <softworkz-at-hotmail.com at ffmpeg.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=0742239289b0d29d219cdb1f80ff1e0a345052d4
---

 fftools/graph/graphprint.c        | 19 ++++---------------
 fftools/textformat/avtextformat.c |  7 +++++--
 2 files changed, 9 insertions(+), 17 deletions(-)

diff --git a/fftools/graph/graphprint.c b/fftools/graph/graphprint.c
index 423878326d..7f0e85d008 100644
--- a/fftools/graph/graphprint.c
+++ b/fftools/graph/graphprint.c
@@ -874,8 +874,6 @@ static int init_graphprint(GraphPrintContext **pgpc, AVBPrint *target_buf)
     AVTextFormatContext *tfc = NULL;
     AVTextWriterContext *wctx = NULL;
     GraphPrintContext *gpc = NULL;
-    char *w_args = NULL;
-    char *w_name;
     int ret;
 
     init_sections();
@@ -883,19 +881,7 @@ static int init_graphprint(GraphPrintContext **pgpc, AVBPrint *target_buf)
 
     av_bprint_init(target_buf, 0, AV_BPRINT_SIZE_UNLIMITED);
 
-    if (!print_graphs_format)
-        print_graphs_format = av_strdup("json");
-    if (!print_graphs_format) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-
-    w_name = av_strtok(print_graphs_format, "=", &w_args);
-    if (!w_name) {
-        av_log(NULL, AV_LOG_ERROR, "No name specified for the filter graph output format\n");
-        ret = AVERROR(EINVAL);
-        goto fail;
-    }
+    const char *w_name = print_graphs_format ? print_graphs_format : "json";
 
     text_formatter = avtext_get_formatter_by_name(w_name);
     if (!text_formatter) {
@@ -912,6 +898,9 @@ static int init_graphprint(GraphPrintContext **pgpc, AVBPrint *target_buf)
     }
 
     AVTextFormatOptions tf_options = { .show_optional_fields = -1 };
+    const char *w_args = print_graphs_format ? strchr(print_graphs_format, '=') : NULL;
+    if (w_args)
+        ++w_args; // consume '='
     ret = avtext_context_open(&tfc, text_formatter, wctx, w_args, sections, FF_ARRAY_ELEMS(sections), tf_options, NULL);
     if (ret < 0) {
         goto fail;
diff --git a/fftools/textformat/avtextformat.c b/fftools/textformat/avtextformat.c
index bb90e66918..e8e43c3c37 100644
--- a/fftools/textformat/avtextformat.c
+++ b/fftools/textformat/avtextformat.c
@@ -706,9 +706,12 @@ const AVTextFormatter *avtext_get_formatter_by_name(const char *name)
 {
     formatters_register_all();
 
-    for (int i = 0; registered_formatters[i]; i++)
-        if (!strcmp(registered_formatters[i]->name, name))
+    for (int i = 0; registered_formatters[i]; i++) {
+        const char *end;
+        if (av_strstart(name, registered_formatters[i]->name, &end) &&
+            (*end == '\0' || *end == '='))
             return registered_formatters[i];
+    }
 
     return NULL;
 }



More information about the ffmpeg-cvslog mailing list