diff options
author | Martin Schwenke <martin@meltin.net> | 2020-06-05 21:52:23 +1000 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2020-06-09 19:46:37 +0000 |
commit | 847208cd8ac68c4c7d1dae63767820db1c69292b (patch) | |
tree | 5fd1b9e13cc3a10f5d2675b52f28823a729e6df4 | |
parent | 922bce2668994dd2a5988c17060f977e9bb0c229 (diff) | |
download | samba-847208cd8ac68c4c7d1dae63767820db1c69292b.tar.gz |
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 <martin@meltin.net>
Reviewed-by: Volker Lendecke <vl@samba.org>
-rw-r--r-- | lib/util/util_paths.c | 27 |
1 files changed, 22 insertions, 5 deletions
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) |