]> code.delx.au - pulseaudio/blobdiff - src/pulse/util.c
util: Check that the home dir is an absolute path
[pulseaudio] / src / pulse / util.c
index 48ccf2951beef152bacb3b507f03613e20e1bfe0..50f90b85bda03a01d7332f801ee4bbc945fbe298 100644 (file)
@@ -58,8 +58,6 @@
 #include <pulse/timeval.h>
 
 #include <pulsecore/socket.h>
-#include <pulsecore/core-error.h>
-#include <pulsecore/log.h>
 #include <pulsecore/core-util.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/usergroup.h>
@@ -133,8 +131,8 @@ char *pa_get_host_name(char *s, size_t l) {
 }
 
 char *pa_get_home_dir(char *s, size_t l) {
-    char *e, *dir;
-
+    char *e;
+    char *dir;
 #ifdef HAVE_PWD_H
     struct passwd *r;
 #endif
@@ -142,11 +140,15 @@ char *pa_get_home_dir(char *s, size_t l) {
     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;
@@ -160,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) {