]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
util: Fix build on FreeBSD by avoiding NSS_BUFLEN_PASSWD
authorMartin Schwenke <martin@meltin.net>
Fri, 5 Jun 2020 11:52:23 +0000 (21:52 +1000)
committerKarolin Seeger <kseeger@samba.org>
Mon, 6 Jul 2020 09:06:23 +0000 (09:06 +0000)
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)

lib/util/util_paths.c

index dec91772d9e6ac99eeb39e36abd28460a1b19959..9bc6df37e5d484e4671e50894e9ba0fb72a1cfea 100644 (file)
@@ -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)