From ce43ff7b424255da1fe7840522d16205c9136e3e Mon Sep 17 00:00:00 2001 From: Taylor R Campbell Date: Mon, 19 Jun 2023 23:49:34 +0000 Subject: [PATCH] roken/getuserinfo.c: Fix various const abuse. --- lib/roken/getuserinfo.c | 86 ++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 56 deletions(-) diff --git a/lib/roken/getuserinfo.c b/lib/roken/getuserinfo.c index 09f4c7315..75f17b146 100644 --- a/lib/roken/getuserinfo.c +++ b/lib/roken/getuserinfo.c @@ -44,6 +44,16 @@ #include #endif +static char * +fillbuf(char *buf, const char *p, size_t bufsz) +{ + + if (strlcpy(buf, p, bufsz) < bufsz) + return buf; + errno = ERANGE; + return NULL; +} + /** * Returns the user's SHELL. */ @@ -61,15 +71,11 @@ roken_get_shell(char *shell, size_t shellsz) #endif if (issuid()) - return "/bin/sh"; + return fillbuf(shell, "/bin/sh", shellsz); p = secure_getenv("SHELL"); - if (p != NULL && p[0] != '\0') { - if (strlcpy(shell, p, shellsz) < shellsz) - return shell; - errno = ERANGE; - return NULL; - } + if (p != NULL && p[0] != '\0') + return fillbuf(shell, p, shellsz); #ifdef HAVE_GETPWNAM_R { @@ -81,25 +87,17 @@ roken_get_shell(char *shell, size_t shellsz) if (username && getpwnam_r(username, &pwd, buf, buflen, &pwdp) == 0 && - pwdp != NULL && pwdp->pw_shell != NULL) { - if (strlcpy(shell, pwdp->pw_shell, shellsz) < shellsz) - return shell; - errno = ERANGE; - return NULL; - } + pwdp != NULL && pwdp->pw_shell != NULL) + return fillbuf(shell, pwdp->pw_shell, shellsz); } #endif errno = 0; - return "/bin/sh"; + return fillbuf(shell, "/bin/sh", shellsz); #else /* Windows */ p = getenv("SHELL"); - if (p != NULL && p[0] != '\0') { - if (strlcpy(shell, p, shellsz) < shellsz) - return shell; - errno = ERANGE; - return NULL; - } + if (p != NULL && p[0] != '\0') + return fillbuf(shell, p, shellsz); errno = 0; return NULL; #endif @@ -151,12 +149,8 @@ roken_get_homedir(char *home, size_t homesz) } p = secure_getenv("HOME"); - if (p != NULL && p[0] != '\0') { - if (strlcpy(home, p, homesz) < homesz) - return home; - errno = ERANGE; - return NULL; - } + if (p != NULL && p[0] != '\0') + return fillbuf(home, p, homesz); #ifdef HAVE_GETPWNAM_R { @@ -168,12 +162,8 @@ roken_get_homedir(char *home, size_t homesz) if (username && getpwnam_r(username, &pwd, buf, buflen, &pwdp) == 0 && - pwdp != NULL && pwdp->pw_dir != NULL) { - if (strlcpy(home, pwdp->pw_dir, homesz) < homesz) - return home; - errno = ERANGE; - return NULL; - } + pwdp != NULL && pwdp->pw_dir != NULL) + return fillbuf(home, pwdp->pw_dir, homesz); } #endif #endif @@ -204,12 +194,8 @@ roken_get_appdatadir(char *appdata, size_t appdatasz) SHGFP_TYPE_CURRENT, appdata))) return appdata; - if ((p = getenv("APPDATA")) != NULL && p[0] != '\0') { - if (strlcpy(appdata, p, appdatasz) < appdatasz) - return appdata; - errno = ERANGE; - return NULL; - } + if ((p = getenv("APPDATA")) != NULL && p[0] != '\0') + return fillbuf(appdata, p, appdatasz); errno = 0; return NULL; @@ -271,12 +257,8 @@ roken_get_username(char *user, size_t usersz) p = secure_getenv("USER"); if (p == NULL || p[0] == '\0') p = secure_getenv("LOGNAME"); - if (p != NULL && p[0] != '\0') { - if (strlcpy(user, p, usersz) < usersz) - return user; - errno = ERANGE; - return NULL; - } + if (p != NULL && p[0] != '\0') + return fillbuf(user, p, usersz); #ifdef HAVE_GETPWUID_R { @@ -285,12 +267,8 @@ roken_get_username(char *user, size_t usersz) char buf[buflen]; if (getpwuid_r(getuid(), &pwd, buf, buflen, &pwdp) == 0 && - pwdp != NULL && pwdp->pw_name != NULL) { - if (strlcpy(user, pwdp->pw_name, usersz) < usersz) - return user; - errno = ERANGE; - return NULL; - } + pwdp != NULL && pwdp->pw_name != NULL) + return fillbuf(user, pwdp->pw_name, usersz); } #endif #endif @@ -318,12 +296,8 @@ roken_get_loginname(char *user, size_t usersz) return NULL; #else #ifdef HAVE_GETLOGIN - if ((p = getlogin()) != NULL && p[0] != '\0') { - if (strlcpy(user, p, usersz) < usersz) - return user; - errno = ERANGE; - return NULL; - } + if ((p = getlogin()) != NULL && p[0] != '\0') + return fillbuf(user, p, usersz); if (errno != ENOENT) return NULL; #endif