From: Timo Sirainen Date: Fri, 17 Sep 2010 16:54:22 +0000 (+0100) Subject: fdpass: Use memcpy() to access data in CMSG_DATA(). X-Git-Tag: 2.0.3~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae7d74df34b7d41e0d232cd9870f7d1d8bb474f7;p=thirdparty%2Fdovecot%2Fcore.git fdpass: Use memcpy() to access data in CMSG_DATA(). This fixes at least AIX where the previous way was broken for some reason. --- diff --git a/src/lib/fdpass.c b/src/lib/fdpass.c index c237bb4edb..43ac800af1 100644 --- a/src/lib/fdpass.c +++ b/src/lib/fdpass.c @@ -107,7 +107,6 @@ ssize_t fd_send(int handle, int send_fd, const void *data, size_t size) 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 @@ ssize_t fd_send(int handle, int send_fd, const void *data, size_t size) 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 @@ ssize_t fd_read(int handle, void *data, size_t size, int *fd) 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 @@ ssize_t fd_read(int handle, void *data, size_t size, int *fd) 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; }