From: Andre Noll Date: Mon, 19 Jun 2023 19:24:29 +0000 (+0200) Subject: string.c: Don't fall back to /tmp in para_homedir(). X-Git-Tag: v0.7.3~4 X-Git-Url: http://git.tue.mpg.de/?a=commitdiff_plain;h=3e0b33d1daabc885c6fb9a8f9efca307a724bc40;p=paraslash.git string.c: Don't fall back to /tmp in para_homedir(). 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. --- diff --git a/string.c b/string.c index 423fd296..d8bd027b 100644 --- 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); } /**