History

fftools: Remove MAX_PATH limit and switch to UTF-8 versions of fopen() and getenv()

Nil Admirari committed 4 years ago

Commit 13350e81 parent dfa062e2 files · +47 −15Browse files

Unified · Split

2 files
  1. fftools/cmdutils.c +40 −13
  2. fftools/ffmpeg_opt.c +7 −2
fftools/cmdutils.c+40−13
@@ -39,6 +39,7 @@ · 38 unmodified lines
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 @@ · 2 unmodified lines
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) · 409 unmodified lines
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) · 2 unmodified lines
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) · 6 unmodified lines
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, · 319 unmodified lines
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, · 2 unmodified lines
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+7−2
@@ -44,6 +44,7 @@ · 43 unmodified lines
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 · 1352 unmodified lines
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 · 11 unmodified lines
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

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t