svn commit: r364199 - stable/12/usr.sbin/nscd
Edward Tomasz Napierala
trasz at FreeBSD.org
Thu Aug 13 17:37:55 UTC 2020
Author: trasz
Date: Thu Aug 13 17:37:54 2020
New Revision: 364199
URL: https://svnweb.freebsd.org/changeset/base/364199
Log:
MFC r340015:
Unbreak nscd(8). Without this change the CMSG gets truncated.
Modified:
stable/12/usr.sbin/nscd/nscdcli.c
stable/12/usr.sbin/nscd/query.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/usr.sbin/nscd/nscdcli.c
==============================================================================
--- stable/12/usr.sbin/nscd/nscdcli.c Thu Aug 13 17:36:52 2020 (r364198)
+++ stable/12/usr.sbin/nscd/nscdcli.c Thu Aug 13 17:37:54 2020 (r364199)
@@ -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: stable/12/usr.sbin/nscd/query.c
==============================================================================
--- stable/12/usr.sbin/nscd/query.c Thu Aug 13 17:36:52 2020 (r364198)
+++ stable/12/usr.sbin/nscd/query.c Thu Aug 13 17:37:54 2020 (r364199)
@@ -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-all
mailing list