svn commit: r340015 - head/usr.sbin/nscd
Edward Tomasz Napierala
trasz at FreeBSD.org
Thu Nov 1 18:19:11 UTC 2018
Author: trasz
Date: Thu Nov 1 18:19:10 2018
New Revision: 340015
URL: https://svnweb.freebsd.org/changeset/base/340015
Log:
Unbreak nscd(8). Without this change the CMSG gets truncated.
Reviewed by: des
MFC after: 2 weeks
Sponsored by: Chalmers University of Technology
Differential Revision: https://reviews.freebsd.org/D17452
Modified:
head/usr.sbin/nscd/nscdcli.c
head/usr.sbin/nscd/query.c
Modified: head/usr.sbin/nscd/nscdcli.c
==============================================================================
--- head/usr.sbin/nscd/nscdcli.c Thu Nov 1 17:45:29 2018 (r340014)
+++ head/usr.sbin/nscd/nscdcli.c Thu Nov 1 18:19:10 2018 (r340015)
@@ -138,14 +138,14 @@ send_credentials(struct nscd_connection_ *connection,
struct msghdr cred_hdr;
struct iovec iov;
- struct {
+ union {
struct cmsghdr hdr;
- struct cmsgcred creds;
+ char cred[CMSG_SPACE(sizeof(struct cmsgcred))];
} cmsg;
TRACE_IN(send_credentials);
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;
@@ -153,7 +153,7 @@ send_credentials(struct nscd_connection_ *connection,
cred_hdr.msg_iov = &iov;
cred_hdr.msg_iovlen = 1;
cred_hdr.msg_control = &cmsg;
- cred_hdr.msg_controllen = sizeof(cmsg);
+ cred_hdr.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred));
iov.iov_base = &type;
iov.iov_len = sizeof(int);
Modified: head/usr.sbin/nscd/query.c
==============================================================================
--- head/usr.sbin/nscd/query.c Thu Nov 1 17:45:29 2018 (r340014)
+++ head/usr.sbin/nscd/query.c Thu Nov 1 18:19:10 2018 (r340015)
@@ -160,7 +160,7 @@ on_query_startup(struct query_state *qstate)
struct cmsgcred *cred;
int elem_type;
- struct {
+ union {
struct cmsghdr hdr;
char cred[CMSG_SPACE(sizeof(struct cmsgcred))];
} cmsg;
@@ -171,8 +171,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 = (caddr_t)&cmsg;
- cred_hdr.msg_controllen = CMSG_LEN(sizeof(struct cmsgcred));
+ cred_hdr.msg_control = &cmsg;
+ cred_hdr.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred));
memset(&iov, 0, sizeof(struct iovec));
iov.iov_base = &elem_type;
@@ -183,7 +183,8 @@ on_query_startup(struct query_state *qstate)
return (-1);
}
- if (cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(struct cmsgcred))
+ if (cred_hdr.msg_controllen < CMSG_LEN(sizeof(struct cmsgcred))
+ || 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);
More information about the svn-src-head
mailing list