From 9ff2caff9875fa761b19edccd4ecdf84937d451f Mon Sep 17 00:00:00 2001 From: NRK Date: Sun, 16 Jul 2023 18:38:43 +0600 Subject: path-unix: abort on path truncation instead of silently proceeding with a truncated path. --- osdep/path-unix.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) (limited to 'osdep/path-unix.c') diff --git a/osdep/path-unix.c b/osdep/path-unix.c index 5dc5cb2836..4a41a4d924 100644 --- a/osdep/path-unix.c +++ b/osdep/path-unix.c @@ -25,10 +25,12 @@ static pthread_once_t path_init_once = PTHREAD_ONCE_INIT; -static char mpv_home[512]; -static char old_home[512]; -static char mpv_cache[512]; -static char mpv_state[512]; +#define CONF_MAX 512 +static char mpv_home[CONF_MAX]; +static char old_home[CONF_MAX]; +static char mpv_cache[CONF_MAX]; +static char mpv_state[CONF_MAX]; +#define MKPATH(BUF, ...) (snprintf((BUF), CONF_MAX, __VA_ARGS__) >= CONF_MAX) static void path_init(void) { @@ -37,36 +39,42 @@ static void path_init(void) char *xdg_config = getenv("XDG_CONFIG_HOME"); char *xdg_state = getenv("XDG_STATE_HOME"); + bool err = false; if (xdg_config && xdg_config[0]) { - snprintf(mpv_home, sizeof(mpv_home), "%s/mpv", xdg_config); + err = err || MKPATH(mpv_home, "%s/mpv", xdg_config); } else if (home && home[0]) { - snprintf(mpv_home, sizeof(mpv_home), "%s/.config/mpv", home); + err = err || MKPATH(mpv_home, "%s/.config/mpv", home); } // Maintain compatibility with old ~/.mpv if (home && home[0]) - snprintf(old_home, sizeof(old_home), "%s/.mpv", home); + err = err || MKPATH(old_home, "%s/.mpv", home); if (xdg_cache && xdg_cache[0]) { - snprintf(mpv_cache, sizeof(mpv_cache), "%s/mpv", xdg_cache); + err = err || MKPATH(mpv_cache, "%s/mpv", xdg_cache); } else if (home && home[0]) { - snprintf(mpv_cache, sizeof(mpv_cache), "%s/.cache/mpv", home); + err = err || MKPATH(mpv_cache, "%s/.cache/mpv", home); } if (xdg_state && xdg_state[0]) { - snprintf(mpv_state, sizeof(mpv_state), "%s/mpv", xdg_state); + err = err || MKPATH(mpv_state, "%s/mpv", xdg_state); } else if (home && home[0]) { - snprintf(mpv_state, sizeof(mpv_state), "%s/.local/state/mpv", home); + err = err || MKPATH(mpv_state, "%s/.local/state/mpv", home); } // If the old ~/.mpv exists, and the XDG config dir doesn't, use the old // config dir only. Also do not use any other XDG directories. if (mp_path_exists(old_home) && !mp_path_exists(mpv_home)) { - snprintf(mpv_home, sizeof(mpv_home), "%s", old_home); - snprintf(mpv_cache, sizeof(mpv_cache), "%s", old_home); - snprintf(mpv_state, sizeof(mpv_state), "%s", old_home); + err = err || MKPATH(mpv_home, "%s", old_home); + err = err || MKPATH(mpv_cache, "%s", old_home); + err = err || MKPATH(mpv_state, "%s", old_home); old_home[0] = '\0'; } + + if (err) { + fprintf(stderr, "Config dir exceeds %d bytes\n", CONF_MAX); + abort(); + } } const char *mp_get_platform_path_unix(void *talloc_ctx, const char *type) -- cgit v1.2.3