From b947683ce1832f8c00952e397ff8b011645b9165 Mon Sep 17 00:00:00 2001 From: Hajimu UMEMOTO Date: Tue, 2 May 2006 23:02:32 +0000 Subject: [PATCH] Fix alignment problem on AMD64. Reported by: Pascal Hofstee Submitted by: Michael Bushkov Tested by: Pascal Hofstee --- lib/libc/net/nscachedcli.c | 8 ++++---- usr.sbin/cached/query.c | 14 ++++++++------ usr.sbin/nscd/query.c | 14 ++++++++------ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/libc/net/nscachedcli.c b/lib/libc/net/nscachedcli.c index 374f37031157..d95a0e8bc9cc 100644 --- a/lib/libc/net/nscachedcli.c +++ b/lib/libc/net/nscachedcli.c @@ -151,19 +151,19 @@ send_credentials(struct cached_connection_ *connection, int type) struct { struct cmsghdr hdr; - struct cmsgcred creds; + char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; } cmsg; memset(&cmsg, 0, sizeof(cmsg)); - cmsg.hdr.cmsg_len = sizeof(cmsg); + cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(struct cmsgcred)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_CREDS; memset(&cred_hdr, 0, sizeof(struct msghdr)); cred_hdr.msg_iov = &iov; cred_hdr.msg_iovlen = 1; - cred_hdr.msg_control = &cmsg; - cred_hdr.msg_controllen = sizeof(cmsg); + cred_hdr.msg_control = (caddr_t)&cmsg; + cred_hdr.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred)); iov.iov_base = &type; iov.iov_len = sizeof(int); diff --git a/usr.sbin/cached/query.c b/usr.sbin/cached/query.c index 28882c3d01df..947e93f905c8 100644 --- a/usr.sbin/cached/query.c +++ b/usr.sbin/cached/query.c @@ -154,11 +154,12 @@ on_query_startup(struct query_state *qstate) { struct msghdr cred_hdr; struct iovec iov; + struct cmsgcred *cred; int elem_type; struct { struct cmsghdr hdr; - struct cmsgcred creds; + char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; } cmsg; TRACE_IN(on_query_startup); @@ -167,8 +168,8 @@ on_query_startup(struct query_state *qstate) memset(&cred_hdr, 0, sizeof(struct msghdr)); cred_hdr.msg_iov = &iov; cred_hdr.msg_iovlen = 1; - cred_hdr.msg_control = &cmsg; - cred_hdr.msg_controllen = sizeof(cmsg); + cred_hdr.msg_control = (caddr_t)&cmsg; + cred_hdr.msg_controllen = CMSG_LEN(sizeof(struct cmsgcred)); memset(&iov, 0, sizeof(struct iovec)); iov.iov_base = &elem_type; @@ -179,15 +180,16 @@ on_query_startup(struct query_state *qstate) return (-1); } - if (cmsg.hdr.cmsg_len != sizeof cmsg + if (cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(struct cmsgcred)) || cmsg.hdr.cmsg_level != SOL_SOCKET || cmsg.hdr.cmsg_type != SCM_CREDS) { TRACE_OUT(on_query_startup); return (-1); } - qstate->uid = cmsg.creds.cmcred_uid; - qstate->gid = cmsg.creds.cmcred_gid; + cred = (struct cmsgcred *)CMSG_DATA(&cmsg); + qstate->uid = cred->cmcred_uid; + qstate->gid = cred->cmcred_gid; #if defined(NS_CACHED_EID_CHECKING) || defined(NS_STRICT_CACHED_EID_CHECKING) /* diff --git a/usr.sbin/nscd/query.c b/usr.sbin/nscd/query.c index 28882c3d01df..947e93f905c8 100644 --- a/usr.sbin/nscd/query.c +++ b/usr.sbin/nscd/query.c @@ -154,11 +154,12 @@ on_query_startup(struct query_state *qstate) { struct msghdr cred_hdr; struct iovec iov; + struct cmsgcred *cred; int elem_type; struct { struct cmsghdr hdr; - struct cmsgcred creds; + char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; } cmsg; TRACE_IN(on_query_startup); @@ -167,8 +168,8 @@ on_query_startup(struct query_state *qstate) memset(&cred_hdr, 0, sizeof(struct msghdr)); cred_hdr.msg_iov = &iov; cred_hdr.msg_iovlen = 1; - cred_hdr.msg_control = &cmsg; - cred_hdr.msg_controllen = sizeof(cmsg); + cred_hdr.msg_control = (caddr_t)&cmsg; + cred_hdr.msg_controllen = CMSG_LEN(sizeof(struct cmsgcred)); memset(&iov, 0, sizeof(struct iovec)); iov.iov_base = &elem_type; @@ -179,15 +180,16 @@ on_query_startup(struct query_state *qstate) return (-1); } - if (cmsg.hdr.cmsg_len != sizeof cmsg + if (cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(struct cmsgcred)) || cmsg.hdr.cmsg_level != SOL_SOCKET || cmsg.hdr.cmsg_type != SCM_CREDS) { TRACE_OUT(on_query_startup); return (-1); } - qstate->uid = cmsg.creds.cmcred_uid; - qstate->gid = cmsg.creds.cmcred_gid; + cred = (struct cmsgcred *)CMSG_DATA(&cmsg); + qstate->uid = cred->cmcred_uid; + qstate->gid = cred->cmcred_gid; #if defined(NS_CACHED_EID_CHECKING) || defined(NS_STRICT_CACHED_EID_CHECKING) /*