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