summaryrefslogtreecommitdiffstats
path: root/lib/libc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc')
-rw-r--r--lib/libc/rpc/clnt_vc.c16
-rw-r--r--lib/libc/rpc/svc_vc.c23
2 files changed, 25 insertions, 14 deletions
diff --git a/lib/libc/rpc/clnt_vc.c b/lib/libc/rpc/clnt_vc.c
index 6cdaad1..d2d0178 100644
--- a/lib/libc/rpc/clnt_vc.c
+++ b/lib/libc/rpc/clnt_vc.c
@@ -793,7 +793,10 @@ __msgread(sock, buf, cnt)
{
struct iovec iov[1];
struct msghdr msg;
- struct cmessage cm;
+ union {
+ struct cmsghdr cmsg;
+ char control[CMSG_SPACE(sizeof(struct cmsgcred))];
+ } cm;
bzero((char *)&cm, sizeof(cm));
iov[0].iov_base = buf;
@@ -804,7 +807,7 @@ __msgread(sock, buf, cnt)
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_control = (caddr_t)&cm;
- msg.msg_controllen = sizeof(struct cmessage);
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred));
msg.msg_flags = 0;
return(_recvmsg(sock, &msg, 0));
@@ -818,7 +821,10 @@ __msgwrite(sock, buf, cnt)
{
struct iovec iov[1];
struct msghdr msg;
- struct cmessage cm;
+ union {
+ struct cmsghdr cmsg;
+ char control[CMSG_SPACE(sizeof(struct cmsgcred))];
+ } cm;
bzero((char *)&cm, sizeof(cm));
iov[0].iov_base = buf;
@@ -826,14 +832,14 @@ __msgwrite(sock, buf, cnt)
cm.cmsg.cmsg_type = SCM_CREDS;
cm.cmsg.cmsg_level = SOL_SOCKET;
- cm.cmsg.cmsg_len = sizeof(struct cmessage);
+ cm.cmsg.cmsg_len = CMSG_LEN(sizeof(struct cmsgcred));
msg.msg_iov = iov;
msg.msg_iovlen = 1;
msg.msg_name = NULL;
msg.msg_namelen = 0;
msg.msg_control = (caddr_t)&cm;
- msg.msg_controllen = sizeof(struct cmessage);
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred));
msg.msg_flags = 0;
return(_sendmsg(sock, &msg, 0));
diff --git a/lib/libc/rpc/svc_vc.c b/lib/libc/rpc/svc_vc.c
index 052678b..95b907a 100644
--- a/lib/libc/rpc/svc_vc.c
+++ b/lib/libc/rpc/svc_vc.c
@@ -400,8 +400,6 @@ read_vc(xprtp, buf, len)
struct pollfd pollfd;
struct sockaddr *sa;
struct cmessage *cm;
- struct cmsghdr *cmp;
- struct sockcred *sc;
xprt = (SVCXPRT *)(void *)xprtp;
assert(xprt != NULL);
@@ -429,9 +427,7 @@ read_vc(xprtp, buf, len)
if (sa->sa_family == AF_LOCAL) {
cm = (struct cmessage *)xprt->xp_verf.oa_base;
if ((len = __msgread_withcred(sock, buf, len, cm)) > 0) {
- cmp = &cm->cmsg;
- sc = (struct sockcred *)(void *)CMSG_DATA(cmp);
- xprt->xp_p2 = sc;
+ xprt->xp_p2 = &cm->cmcred;
return (len);
}
} else {
@@ -638,8 +634,14 @@ __msgread_withcred(sock, buf, cnt, cmp)
{
struct iovec iov[1];
struct msghdr msg;
+ union {
+ struct cmsghdr cmsg;
+ char control[CMSG_SPACE(sizeof(struct cmsgcred))];
+ } cm;
+ int ret;
+
- bzero(cmp, sizeof(*cmp));
+ bzero(&cm, sizeof(cm));
iov[0].iov_base = buf;
iov[0].iov_len = cnt;
@@ -647,11 +649,14 @@ __msgread_withcred(sock, buf, cnt, cmp)
msg.msg_iovlen = 1;
msg.msg_name = NULL;
msg.msg_namelen = 0;
- msg.msg_control = cmp;
- msg.msg_controllen = sizeof(struct cmessage);
+ msg.msg_control = &cm;
+ msg.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred));
msg.msg_flags = 0;
- return(_recvmsg(sock, &msg, 0));
+ ret = _recvmsg(sock, &msg, 0);
+ bcopy(&cm.cmsg, &cmp->cmsg, sizeof(cmp->cmsg));
+ bcopy(CMSG_DATA(&cm), &cmp->cmcred, sizeof(cmp->cmcred));
+ return ret;
}
static int
OpenPOWER on IntegriCloud