Skip to content

Commit 13350e8

Browse files
nihil-admirarimstorsjo
authored andcommitted
fftools: Remove MAX_PATH limit and switch to UTF-8 versions of fopen() and getenv()
Signed-off-by: Martin Storsjö <martin@martin.st>
1 parent dfa062e commit 13350e8

File tree

2 files changed

+47
-15
lines changed

2 files changed

+47
-15
lines changed

fftools/cmdutils.c

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "libavutil/avstring.h"
4040
#include "libavutil/channel_layout.h"
4141
#include "libavutil/display.h"
42+
#include "libavutil/getenv_utf8.h"
4243
#include "libavutil/mathematics.h"
4344
#include "libavutil/imgutils.h"
4445
#include "libavutil/libm.h"
@@ -47,9 +48,11 @@
4748
#include "libavutil/dict.h"
4849
#include "libavutil/opt.h"
4950
#include "cmdutils.h"
51+
#include "fopen_utf8.h"
5052
#include "opt_common.h"
5153
#ifdef _WIN32
5254
#include <windows.h>
55+
#include "compat/w32dlfcn.h"
5356
#endif
5457

5558
AVDictionary *sws_dict;
@@ -465,7 +468,7 @@ static void check_options(const OptionDef *po)
465468
void parse_loglevel(int argc, char **argv, const OptionDef *options)
466469
{
467470
int idx = locate_option(argc, argv, options, "loglevel");
468-
const char *env;
471+
char *env;
469472

470473
check_options(options);
471474

@@ -474,7 +477,8 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options)
474477
if (idx && argv[idx + 1])
475478
opt_loglevel(NULL, "loglevel", argv[idx + 1]);
476479
idx = locate_option(argc, argv, options, "report");
477-
if ((env = getenv("FFREPORT")) || idx) {
480+
env = getenv_utf8("FFREPORT");
481+
if (env || idx) {
478482
FILE *report_file = NULL;
479483
init_report(env, &report_file);
480484
if (report_file) {
@@ -487,6 +491,7 @@ void parse_loglevel(int argc, char **argv, const OptionDef *options)
487491
fflush(report_file);
488492
}
489493
}
494+
freeenv_utf8(env);
490495
idx = locate_option(argc, argv, options, "hide_banner");
491496
if (idx)
492497
hide_banner = 1;
@@ -812,28 +817,45 @@ FILE *get_preset_file(char *filename, size_t filename_size,
812817
{
813818
FILE *f = NULL;
814819
int i;
815-
const char *base[3] = { getenv("FFMPEG_DATADIR"),
816-
getenv("HOME"),
820+
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
821+
char *datadir = NULL;
822+
#endif
823+
char *env_home = getenv_utf8("HOME");
824+
char *env_ffmpeg_datadir = getenv_utf8("FFMPEG_DATADIR");
825+
const char *base[3] = { env_home,
826+
env_ffmpeg_datadir,
817827
FFMPEG_DATADIR, };
818828

819829
if (is_path) {
820830
av_strlcpy(filename, preset_name, filename_size);
821-
f = fopen(filename, "r");
831+
f = fopen_utf8(filename, "r");
822832
} else {
823833
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
824-
char datadir[MAX_PATH], *ls;
834+
wchar_t *datadir_w = get_module_filename(NULL);
825835
base[2] = NULL;
826836

827-
if (GetModuleFileNameA(GetModuleHandleA(NULL), datadir, sizeof(datadir) - 1))
837+
if (wchartoutf8(datadir_w, &datadir))
838+
datadir = NULL;
839+
av_free(datadir_w);
840+
841+
if (datadir)
828842
{
829-
for (ls = datadir; ls < datadir + strlen(datadir); ls++)
843+
char *ls;
844+
for (ls = datadir; *ls; ls++)
830845
if (*ls == '\\') *ls = '/';
831846

832847
if (ls = strrchr(datadir, '/'))
833848
{
834-
*ls = 0;
835-
strncat(datadir, "/ffpresets", sizeof(datadir) - 1 - strlen(datadir));
836-
base[2] = datadir;
849+
ptrdiff_t datadir_len = ls - datadir;
850+
size_t desired_size = datadir_len + strlen("/ffpresets") + 1;
851+
char *new_datadir = av_realloc_array(
852+
datadir, desired_size, sizeof *datadir);
853+
if (new_datadir) {
854+
datadir = new_datadir;
855+
datadir[datadir_len] = 0;
856+
strncat(datadir, "/ffpresets", desired_size - 1 - datadir_len);
857+
base[2] = datadir;
858+
}
837859
}
838860
}
839861
#endif
@@ -842,17 +864,22 @@ FILE *get_preset_file(char *filename, size_t filename_size,
842864
continue;
843865
snprintf(filename, filename_size, "%s%s/%s.ffpreset", base[i],
844866
i != 1 ? "" : "/.ffmpeg", preset_name);
845-
f = fopen(filename, "r");
867+
f = fopen_utf8(filename, "r");
846868
if (!f && codec_name) {
847869
snprintf(filename, filename_size,
848870
"%s%s/%s-%s.ffpreset",
849871
base[i], i != 1 ? "" : "/.ffmpeg", codec_name,
850872
preset_name);
851-
f = fopen(filename, "r");
873+
f = fopen_utf8(filename, "r");
852874
}
853875
}
854876
}
855877

878+
#if HAVE_GETMODULEHANDLE && defined(_WIN32)
879+
av_free(datadir);
880+
#endif
881+
freeenv_utf8(env_ffmpeg_datadir);
882+
freeenv_utf8(env_home);
856883
return f;
857884
}
858885

fftools/ffmpeg_opt.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
#include "libavutil/avutil.h"
4545
#include "libavutil/bprint.h"
4646
#include "libavutil/channel_layout.h"
47+
#include "libavutil/getenv_utf8.h"
4748
#include "libavutil/intreadwrite.h"
4849
#include "libavutil/fifo.h"
4950
#include "libavutil/mathematics.h"
@@ -1402,8 +1403,10 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
14021403
{
14031404
int i, ret = -1;
14041405
char filename[1000];
1405-
const char *base[3] = { getenv("AVCONV_DATADIR"),
1406-
getenv("HOME"),
1406+
char *env_avconv_datadir = getenv_utf8("AVCONV_DATADIR");
1407+
char *env_home = getenv_utf8("HOME");
1408+
const char *base[3] = { env_avconv_datadir,
1409+
env_home,
14071410
AVCONV_DATADIR,
14081411
};
14091412

@@ -1421,6 +1424,8 @@ static int get_preset_file_2(const char *preset_name, const char *codec_name, AV
14211424
ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
14221425
}
14231426
}
1427+
freeenv_utf8(env_home);
1428+
freeenv_utf8(env_avconv_datadir);
14241429
return ret;
14251430
}
14261431

0 commit comments

Comments
 (0)