? 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*/