From: Martin Schwenke Date: Fri, 5 Jun 2020 11:52:23 +0000 (+1000) Subject: util: Fix build on FreeBSD by avoiding NSS_BUFLEN_PASSWD X-Git-Tag: samba-4.10.18~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=57bd719af1f138f44f71b2078995452582da0da6;p=thirdparty%2Fsamba.git util: Fix build on FreeBSD by avoiding NSS_BUFLEN_PASSWD NSS_BUFLEN_PASSWD is not defined on FreeBSD. Use sysconf(_SC_GETPW_R_SIZE_MAX) instead, as per POSIX. Use a dynamically allocated buffer instead of trying to cram all of the logic into the declarations. This will come in useful later anyway. Signed-off-by: Martin Schwenke Reviewed-by: Volker Lendecke Reviewed-by: Bjoern Jacke (cherry picked from commit 847208cd8ac68c4c7d1dae63767820db1c69292b) --- diff --git a/lib/util/util_paths.c b/lib/util/util_paths.c index dec91772d9e..9bc6df37e5d 100644 --- a/lib/util/util_paths.c +++ b/lib/util/util_paths.c @@ -68,24 +68,41 @@ static char *get_user_home_dir(TALLOC_CTX *mem_ctx) { struct passwd pwd = {0}; struct passwd *pwdbuf = NULL; - char buf[NSS_BUFLEN_PASSWD] = {0}; + char *buf = NULL; + char *out = NULL; + long int initlen; size_t len; int rc; - rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf); + initlen = sysconf(_SC_GETPW_R_SIZE_MAX); + if (initlen == -1) { + len = 1024; + } else { + len = (size_t)initlen; + } + buf = talloc_size(mem_ctx, len); + if (buf == NULL) { + return NULL; + } + + rc = getpwuid_r(getuid(), &pwd, buf, len, &pwdbuf); if (rc != 0 || pwdbuf == NULL ) { const char *szPath = getenv("HOME"); if (szPath == NULL) { - return NULL; + goto done; } len = strnlen(szPath, PATH_MAX); if (len >= PATH_MAX) { return NULL; } - return talloc_strdup(mem_ctx, szPath); + out = talloc_strdup(mem_ctx, szPath); + goto done; } - return talloc_strdup(mem_ctx, pwd.pw_dir); + out = talloc_strdup(mem_ctx, pwd.pw_dir); +done: + TALLOC_FREE(buf); + return out; } char *path_expand_tilde(TALLOC_CTX *mem_ctx, const char *d)