dovecot-2.0: fdpass: Use memcpy() to access data in CMSG_DATA().

dovecot at dovecot.org dovecot at dovecot.org
Fri Sep 17 19:54:25 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/bdf922d26534
changeset: 12130:bdf922d26534
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Sep 17 17:54:22 2010 +0100
description:
fdpass: Use memcpy() to access data in CMSG_DATA().
This fixes at least AIX where the previous way was broken for some reason.

diffstat:

 src/lib/fdpass.c |  11 +++--------
 1 files changed, 3 insertions(+), 8 deletions(-)

diffs (42 lines):

diff -r 4a5e2be6e112 -r bdf922d26534 src/lib/fdpass.c
--- a/src/lib/fdpass.c	Fri Sep 17 17:30:30 2010 +0100
+++ b/src/lib/fdpass.c	Fri Sep 17 17:54:22 2010 +0100
@@ -107,7 +107,6 @@
         struct const_iovec iov;
         struct cmsghdr *cmsg;
 	char buf[CMSG_SPACE(sizeof(int))];
-	void *cmsg_data;
 
 	/* at least one byte is required to be sent with fd passing */
 	i_assert(size > 0 && size < INT_MAX);
@@ -130,8 +129,7 @@
 		cmsg->cmsg_level = SOL_SOCKET;
 		cmsg->cmsg_type = SCM_RIGHTS;
 		cmsg->cmsg_len = CMSG_LEN(sizeof(int));
-		cmsg_data = CMSG_DATA(cmsg);
-		*(int *)cmsg_data = send_fd;
+		memcpy(CMSG_DATA(cmsg), &send_fd, sizeof(send_fd));
 
 		/* set the real length we want to use. Do it after all is
 		   set just in case CMSG macros required the extra padding
@@ -166,7 +164,6 @@
 	struct cmsghdr *cmsg;
 	ssize_t ret;
 	char buf[CMSG_SPACE(sizeof(int))];
-	void *cmsg_data;
 
 	i_assert(size > 0 && size < INT_MAX);
 
@@ -196,10 +193,8 @@
 	cmsg = CMSG_FIRSTHDR(&msg);
 	if (!CHECK_MSG(msg) || !CHECK_CMSG(cmsg))
 		*fd = -1;
-	else {
-		cmsg_data = CMSG_DATA(cmsg);
-		*fd = *(int *)cmsg_data;
-	}
+	else
+		memcpy(fd, CMSG_DATA(cmsg), sizeof(*fd));
 	return ret;
 }
 


More information about the dovecot-cvs mailing list