[FFmpeg-devel] [PATCH 1/4] fftools/cmdutils: allow arbitrary length paths for preset files

Marton Balint cus at passwd.hu
Sat May 17 02:08:58 EEST 2025


Signed-off-by: Marton Balint <cus at passwd.hu>
---
 fftools/cmdutils.c   | 17 ++++++++++-------
 fftools/cmdutils.h   |  4 ++--
 fftools/ffmpeg_opt.c | 14 +++++++++-----
 3 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index be21ed2c6c..e516ee6ebd 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -920,7 +920,7 @@ int read_yesno(void)
     return yesno;
 }
 
-FILE *get_preset_file(char *filename, size_t filename_size,
+FILE *get_preset_file(AVBPrint *filename,
                       const char *preset_name, int is_path,
                       const char *codec_name)
 {
@@ -936,8 +936,9 @@ FILE *get_preset_file(char *filename, size_t filename_size,
                             FFMPEG_DATADIR, };
 
     if (is_path) {
-        av_strlcpy(filename, preset_name, filename_size);
-        f = fopen_utf8(filename, "r");
+        av_bprintf(filename, "%s", preset_name);
+        if (av_bprint_is_complete(filename))
+            f = fopen_utf8(filename->str, "r");
     } else {
 #if HAVE_GETMODULEHANDLE && defined(_WIN32)
         wchar_t *datadir_w = get_module_filename(NULL);
@@ -971,15 +972,17 @@ FILE *get_preset_file(char *filename, size_t filename_size,
         for (i = 0; i < 3 && !f; i++) {
             if (!base[i])
                 continue;
-            snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
+            av_bprint_clear(filename);
+            av_bprintf(filename, "%s%s/%s.ffpreset", base[i],
                      i != 1 ? "" : "/.ffmpeg", preset_name);
-            f = fopen_utf8(filename, "r");
+            f = fopen_utf8(filename->str, "r");
             if (!f && codec_name) {
-                snprintf(filename, filename_size,
+                av_bprint_clear(filename);
+                av_bprintf(filename,
                          "%s%s/%s-%s.ffpreset",
                          base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
                          preset_name);
-                f = fopen_utf8(filename, "r");
+                f = fopen_utf8(filename->str, "r");
             }
         }
     }
diff --git a/fftools/cmdutils.h b/fftools/cmdutils.h
index ad020f893a..216a2bcfe7 100644
--- a/fftools/cmdutils.h
+++ b/fftools/cmdutils.h
@@ -28,6 +28,7 @@
 #include "libavcodec/avcodec.h"
 #include "libavfilter/avfilter.h"
 #include "libavformat/avformat.h"
+#include "libavutil/bprint.h"
 #include "libswscale/swscale.h"
 
 #ifdef _WIN32
@@ -495,13 +496,12 @@ int read_yesno(void);
  * codec_name-preset_name.avpreset in the above-mentioned directories.
  *
  * @param filename buffer where the name of the found filename is written
- * @param filename_size size in bytes of the filename buffer
  * @param preset_name name of the preset to search
  * @param is_path tell if preset_name is a filename path
  * @param codec_name name of the codec for which to look for the
  * preset, may be NULL
  */
-FILE *get_preset_file(char *filename, size_t filename_size,
+FILE *get_preset_file(AVBPrint *filename,
                       const char *preset_name, int is_path, const char *codec_name);
 
 /**
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 3d1efe32f9..aafacb8f1c 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -42,6 +42,7 @@
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/avutil.h"
+#include "libavutil/bprint.h"
 #include "libavutil/mathematics.h"
 #include "libavutil/mem.h"
 #include "libavutil/opt.h"
@@ -1017,13 +1018,15 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
 {
     OptionsContext *o = optctx;
     FILE *f=NULL;
-    char filename[1000], line[1000], tmp_line[1000];
+    char line[1000], tmp_line[1000];
+    AVBPrint filename;
     const char *codec_name = NULL;
     int ret = 0;
 
     codec_name = opt_match_per_type_str(&o->codec_names, *opt);
+    av_bprint_init(&filename, 0, AV_BPRINT_SIZE_UNLIMITED);
 
-    if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
+    if (!(f = get_preset_file(&filename, arg, *opt == 'f', codec_name))) {
         if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
             av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
         }else
@@ -1039,11 +1042,11 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
         av_strlcpy(tmp_line, line, sizeof(tmp_line));
         if (!av_strtok(key,   "=",    &value) ||
             !av_strtok(value, "\r\n", &endptr)) {
-            av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
+            av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename.str, line);
             ret = AVERROR(EINVAL);
             goto fail;
         }
-        av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
+        av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename.str, key, value);
 
         if      (!strcmp(key, "acodec")) opt_audio_codec   (o, key, value);
         else if (!strcmp(key, "vcodec")) opt_video_codec   (o, key, value);
@@ -1051,7 +1054,7 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
         else if (!strcmp(key, "dcodec")) opt_data_codec    (o, key, value);
         else if (opt_default_new(o, key, value) < 0) {
             av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
-                   filename, line, key, value);
+                   filename.str, line, key, value);
             ret = AVERROR(EINVAL);
             goto fail;
         }
@@ -1059,6 +1062,7 @@ static int opt_preset(void *optctx, const char *opt, const char *arg)
 
 fail:
     fclose(f);
+    av_bprint_finalize(&filename, NULL);
 
     return ret;
 }
-- 
2.43.0



More information about the ffmpeg-devel mailing list