| From 57bd719af1f138f44f71b2078995452582da0da6 Mon Sep 17 00:00:00 2001 |
| From: Martin Schwenke <martin@meltin.net> |
| Date: Fri, 5 Jun 2020 21:52:23 +1000 |
| Subject: [PATCH 2/3] 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> |
| Reviewed-by: Bjoern Jacke <bjacke@samba.org> |
| (cherry picked from commit 847208cd8ac68c4c7d1dae63767820db1c69292b) |
| |
| Upstream-Status:Backport |
| [https://gitlab.com/samba-team/samba/-/commit/57bd719af1f138f44f71b2078995452582da0da6] |
| |
| Signed-off-by: Yi Zhao <yi.zhao@windriver.com> |
| --- |
| lib/util/util_paths.c | 27 ++++++++++++++++++++++----- |
| 1 file 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) |
| -- |
| 2.17.1 |
| |