]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
string.c: Don't fall back to /tmp in para_homedir().
authorAndre Noll <maan@tuebingen.mpg.de>
Mon, 19 Jun 2023 19:24:29 +0000 (21:24 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 24 Dec 2023 21:37:00 +0000 (22:37 +0100)
This can only lead to trouble. If we can't get the path to the home
directory, something is deeply wrong and we really should abort.

string.c

index 423fd296bde6dc12d0ce6c042a7a5d674913eaa2..d8bd027b7010a149be59b8883b3e5ee685fb3c01 100644 (file)
--- a/string.c
+++ b/string.c
@@ -308,15 +308,32 @@ __must_check __malloc char *para_logname(void)
 }
 
 /**
- * Get the home directory of the current user.
+ * Get the home directory of the calling user.
  *
  * \return A dynamically allocated string that must be freed by the caller. If
- * the home directory could not be found, this function returns "/tmp".
+ * no entry is found which matches the UID of the calling process, or any other
+ * error occurs, the function prints an error message and aborts.
+ *
+ * \sa getpwuid(3), getuid(2).
  */
 __must_check __malloc char *para_homedir(void)
 {
-       struct passwd *pw = getpwuid(getuid());
-       return para_strdup(pw? pw->pw_dir : "/tmp");
+       struct passwd *pw;
+
+       /*
+        * To distinguish between the error case and the "not found" case we
+        * have to check errno after getpwuid(3). The manual page recommends to
+        * set it to zero before the call.
+        */
+       errno = 0;
+       pw = getpwuid(getuid());
+       if (pw)
+               return para_strdup(pw->pw_dir);
+       if (errno != 0)
+               PARA_EMERG_LOG("getpwuid error: %s\n", strerror(errno));
+       else
+               PARA_EMERG_LOG("no pw entry for uid %u\n", (unsigned)getuid());
+       exit(EXIT_FAILURE);
 }
 
 /**