util: Check that the home dir is an absolute path

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.
This commit is contained in:
Tanu Kaskinen 2014-03-19 12:16:08 +02:00
parent e1440395d1
commit aca30527e2

View file

@ -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 *pa_get_home_dir(char *s, size_t l) {
char *e; char *e;
#ifdef HAVE_PWD_H
char *dir; char *dir;
#ifdef HAVE_PWD_H
struct passwd *r; struct passwd *r;
#endif #endif
pa_assert(s); pa_assert(s);
pa_assert(l > 0); pa_assert(l > 0);
if ((e = getenv("HOME"))) if ((e = getenv("HOME"))) {
return pa_strlcpy(s, e, l); dir = pa_strlcpy(s, e, l);
goto finish;
}
if ((e = getenv("USERPROFILE"))) if ((e = getenv("USERPROFILE"))) {
return pa_strlcpy(s, e, l); dir = pa_strlcpy(s, e, l);
goto finish;
}
#ifdef HAVE_PWD_H #ifdef HAVE_PWD_H
errno = 0; errno = 0;
@ -158,13 +162,21 @@ char *pa_get_home_dir(char *s, size_t l) {
dir = pa_strlcpy(s, r->pw_dir, l); dir = pa_strlcpy(s, r->pw_dir, l);
pa_getpwuid_free(r); pa_getpwuid_free(r);
#endif /* HAVE_PWD_H */
return dir; finish:
#else /* HAVE_PWD_H */ if (!dir) {
errno = ENOENT; errno = ENOENT;
return NULL; 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) { char *pa_get_binary_name(char *s, size_t l) {