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

Reply via email to