Avoid unpredictable behaviour in case e.g. the HOME environment variable is incorrectly set up for whatever reason. I haven't seen non-absolute HOME anywhere, but this feels like a good sanity check anyway. --- src/pulse/util.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/pulse/util.c b/src/pulse/util.c index 6656bc3..50f90b8 100644 --- a/src/pulse/util.c +++ b/src/pulse/util.c @@ -132,19 +132,23 @@ char *pa_get_host_name(char *s, size_t l) { char *pa_get_home_dir(char *s, size_t l) { char *e; -#ifdef HAVE_PWD_H char *dir; +#ifdef HAVE_PWD_H struct passwd *r; #endif pa_assert(s); pa_assert(l > 0); - if ((e = getenv("HOME"))) - return pa_strlcpy(s, e, l); + if ((e = getenv("HOME"))) { + dir = pa_strlcpy(s, e, l); + goto finish; + } - if ((e = getenv("USERPROFILE"))) - return pa_strlcpy(s, e, l); + if ((e = getenv("USERPROFILE"))) { + dir = pa_strlcpy(s, e, l); + goto finish; + } #ifdef HAVE_PWD_H errno = 0; @@ -158,13 +162,21 @@ char *pa_get_home_dir(char *s, size_t l) { dir = pa_strlcpy(s, r->pw_dir, l); pa_getpwuid_free(r); +#endif /* HAVE_PWD_H */ - return dir; -#else /* HAVE_PWD_H */ +finish: + if (!dir) { + errno = ENOENT; + return NULL; + } - errno = ENOENT; - return NULL; -#endif + if (!pa_is_path_absolute(dir)) { + pa_log("Failed to get the home directory, not an absolute path: %s", dir); + errno = ENOENT; + return NULL; + } + + return dir; } char *pa_get_binary_name(char *s, size_t l) { -- 1.8.3.1