changeset 3978:6f21ccb60df4 HEAD

If error message from PAM was over ~500 bytes, we crashed. Probably never happened. Also use PIPE_BUF instead of hardcoded 512 bytes.
author Timo Sirainen <tss@iki.fi>
date Sun, 05 Feb 2006 09:24:37 +0200
parents dcd4e8ccd639
children f209b3fc77e4
files src/auth/passdb-pam.c
diffstat 1 files changed, 10 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/passdb-pam.c	Sun Feb 05 09:19:24 2006 +0200
+++ b/src/auth/passdb-pam.c	Sun Feb 05 09:24:37 2006 +0200
@@ -237,7 +237,7 @@
 	enum passdb_result result;
 	int ret, status, status2;
 	const char *str;
-	char buf_data[512];
+	size_t size;
 	buffer_t *buf;
 
 	conv.conv = pam_userpass_conv;
@@ -269,16 +269,16 @@
 		}
 	}
 
-	buf = buffer_create_data(pool_datastack_create(),
-				 buf_data, sizeof(buf_data));
+	buf = buffer_create_dynamic(pool_datastack_create(), 512);
 	buffer_append(buf, &result, sizeof(result));
 
-	if (str != NULL) {
-		/* may truncate the error. tough luck. */
+	if (str != NULL) 
 		buffer_append(buf, str, strlen(str));
-	}
 
-	if ((ret = write(fd, buf_data, buf->used)) != (int)buf->used) {
+	/* Don't send larger writes than what would block. truncated error
+	   message isn't that bad.. */
+        size = I_MIN(buf->used, PIPE_BUF);
+	if ((ret = write(fd, buf->data, size)) != (int)size) {
 		if (ret < 0)
 			i_error("write() failed: %m");
 		else {
@@ -293,11 +293,11 @@
 	struct pam_auth_request *request = context;
 	struct auth_request *auth_request = request->request;
 	enum passdb_result result;
-	char buf[513];
+	char buf[PIPE_BUF + 1];
 	ssize_t ret;
 
-	/* POSIX guarantees that writing 512 bytes or less to pipes is atomic.
-	   We rely on that. */
+	/* POSIX guarantees that writing PIPE_BUF bytes or less to pipes is
+	   atomic. We rely on that. */
 	ret = read(request->fd, buf, sizeof(buf)-1);
 	if (ret < 0) {
 		auth_request_log_error(auth_request, "pam",