From e89e6dda99fbc3d0d952da5692014326f8cf7a74 Mon Sep 17 00:00:00 2001 From: C. McEnroe Date: Tue, 26 Jan 2021 15:39:13 -0500 Subject: Tighten up XDG base directory path handling Don't search base directories if path starts with "/", "./" or "../", but still do if the path simply starts with ".". Bail early if HOME is needed but unset. Don't attempt to open the original path in configOpen and dataOpen. --- xdg.c | 37 ++++++++++++------------------------- 1 file changed, 12 insertions(+), 25 deletions(-) (limited to 'xdg.c') diff --git a/xdg.c b/xdg.c index c706e87..b206427 100644 --- a/xdg.c +++ b/xdg.c @@ -71,7 +71,7 @@ basePath(struct Base base, const char **dirs, const char *path) { return buf; } - if (path[0] == '/' || path[0] == '.') { + if (path[strspn(path, ".")] == '/') { *dirs = ""; return path; } @@ -89,7 +89,7 @@ basePath(struct Base base, const char **dirs, const char *path) { home, base.defHome, path ); } else { - return NULL; + errx(EX_CONFIG, "HOME unset"); } return buf; } @@ -98,8 +98,7 @@ const char *configPath(const char **dirs, const char *path) { return basePath(Config, dirs, path); } -const char * -dataPath(const char **dirs, const char *path) { +const char *dataPath(const char **dirs, const char *path) { return basePath(Data, dirs, path); } @@ -110,17 +109,16 @@ FILE *configOpen(const char *path, const char *mode) { if (file) return file; if (errno != ENOENT) warn("%s", abs); } - FILE *file = fopen(path, mode); - if (!file) warn("%s", path); - return file; + dirs = NULL; + warn("%s", configPath(&dirs, path)); + return NULL; } void dataMkdir(const char *path) { const char *dirs = NULL; - const char *abs = dataPath(&dirs, path); - if (!abs) return; - int error = mkdir(abs, S_IRWXU); - if (error && errno != EEXIST) warn("%s", abs); + path = dataPath(&dirs, path); + int error = mkdir(path, S_IRWXU); + if (error && errno != EEXIST) warn("%s", path); } FILE *dataOpen(const char *path, const char *mode) { @@ -130,20 +128,9 @@ FILE *dataOpen(const char *path, const char *mode) { if (file) return file; if (errno != ENOENT) warn("%s", abs); } - - if (mode[0] != 'r') { - dataMkdir(""); - dirs = NULL; - path = dataPath(&dirs, path); - if (!path) { - warn("HOME unset"); - return NULL; - } - FILE *file = fopen(path, mode); - if (!file) warn("%s", path); - return file; - } - + if (mode[0] != 'r') dataMkdir(""); + dirs = NULL; + path = dataPath(&dirs, path); FILE *file = fopen(path, mode); if (!file) warn("%s", path); return file; -- cgit 1.4.1-2-gfad0