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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to