? pam_start.c.diff Index: pam_start.c =================================================================== RCS file: /cvsroot/src/external/bsd/openpam/dist/lib/pam_start.c,v retrieving revision 1.2 diff -u -u -r1.2 pam_start.c --- pam_start.c 25 Dec 2011 22:27:56 -0000 1.2 +++ pam_start.c 27 Dec 2011 20:20:49 -0000 @@ -53,7 +53,7 @@ #ifdef _SC_HOST_NAME_MAX #define HOST_NAME_MAX sysconf(_SC_HOST_NAME_MAX) #else -#define HOST_NAME_MAX 1024 +#define HOST_NAME_MAX -1 #endif /* @@ -69,17 +69,21 @@ const struct pam_conv *pam_conv, pam_handle_t **pamh) { - char hostname[HOST_NAME_MAX + 1]; + char *hostname = NULL; struct pam_handle *ph; int r; + long h = HOST_NAME_MAX; + size_t hostname_size = (h == -1 ? 1024 : h) + 1; ENTER(); if ((ph = calloc((size_t)1, sizeof *ph)) == NULL) RETURNC(PAM_BUF_ERR); if ((r = pam_set_item(ph, PAM_SERVICE, service)) != PAM_SUCCESS) goto fail; - if (gethostname(hostname, sizeof hostname) != 0) - strlcpy(hostname, "localhost", sizeof hostname); + if ((hostname = malloc(hostname_size)) == NULL) + goto fail; + if (gethostname(hostname, hostname_size) != 0) + strlcpy(hostname, "localhost", hostname_size); if ((r = pam_set_item(ph, PAM_HOST, hostname)) != PAM_SUCCESS) goto fail; if ((r = pam_set_item(ph, PAM_USER, user)) != PAM_SUCCESS) @@ -88,10 +92,12 @@ goto fail; if ((r = openpam_configure(ph, service)) != PAM_SUCCESS) goto fail; + free(hostname); *pamh = ph; openpam_log(PAM_LOG_DEBUG, "pam_start(\"%s\") succeeded", service); RETURNC(PAM_SUCCESS); fail: + free(hostname); pam_end(ph, r); RETURNC(r); /*NOTREACHED*/