summaryrefslogtreecommitdiffstats
path: root/osdep/path-unix.c
diff options
context:
space:
mode:
authorNRK <nrk@disroot.org>2023-07-16 18:38:43 +0600
committeravih <avih@users.noreply.github.com>2023-08-12 00:20:27 +0300
commit9ff2caff9875fa761b19edccd4ecdf84937d451f (patch)
tree71d2794f0c41a8b0b259d16ce39065f7e362d93a /osdep/path-unix.c
parentdfbdf7516586427083a868307a77c35bab8bc764 (diff)
downloadmpv-9ff2caff9875fa761b19edccd4ecdf84937d451f.tar.bz2
mpv-9ff2caff9875fa761b19edccd4ecdf84937d451f.tar.xz
path-unix: abort on path truncation
instead of silently proceeding with a truncated path.
Diffstat (limited to 'osdep/path-unix.c')
-rw-r--r--osdep/path-unix.c36
1 files changed, 22 insertions, 14 deletions
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)