Author: dchagin
Date: Wed Jun 17 21:52:39 2009
New Revision: 194405
URL: http://svn.freebsd.org/changeset/base/194405

Log:
  MFC r192284:
  
  Implement MSG_CMSG_CLOEXEC flag for linux_recvmsg().
  
  Approved by:  kib (mentor)

Modified:
  stable/7/sys/   (props changed)
  stable/7/sys/compat/linux/linux_socket.c
  stable/7/sys/compat/linux/linux_socket.h
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/compat/linux/linux_socket.c
==============================================================================
--- stable/7/sys/compat/linux/linux_socket.c    Wed Jun 17 21:49:41 2009        
(r194404)
+++ stable/7/sys/compat/linux/linux_socket.c    Wed Jun 17 21:52:39 2009        
(r194405)
@@ -1139,7 +1139,7 @@ linux_recvmsg(struct thread *td, struct 
        struct mbuf **controlp;
        caddr_t outbuf;
        void *data;
-       int error;
+       int error, i, fd, fds, *fdp;
 
        error = copyin(PTRIN(args->msg), &linux_msg, sizeof(linux_msg));
        if (error)
@@ -1208,15 +1208,30 @@ linux_recvmsg(struct thread *td, struct 
                        data = CMSG_DATA(cm);
                        datalen = (caddr_t)cm + cm->cmsg_len - (caddr_t)data;
 
-                       if (outlen + LINUX_CMSG_LEN(datalen) >
-                           linux_msg.msg_controllen) {
-                               if (outlen == 0) {
-                                       error = EMSGSIZE;
-                                       goto bad;
-                               } else {
-                                       linux_msg.msg_flags |= LINUX_MSG_CTRUNC;
-                                       goto out;
+                       switch (linux_cmsg->cmsg_type)
+                       {
+                       case LINUX_SCM_RIGHTS:
+                               if (outlen + LINUX_CMSG_LEN(datalen) >
+                                   linux_msg.msg_controllen) {
+                                       if (outlen == 0) {
+                                               error = EMSGSIZE;
+                                               goto bad;
+                                       } else {
+                                               linux_msg.msg_flags |=
+                                                   LINUX_MSG_CTRUNC;
+                                               goto out;
+                                       }
+                               }
+                               if (args->flags & LINUX_MSG_CMSG_CLOEXEC) {
+                                       fds = datalen / sizeof(int);
+                                       fdp = data;
+                                       for (i = 0; i < fds; i++) {
+                                               fd = *fdp++;
+                                               (void)kern_fcntl(td, fd,
+                                                   F_SETFD, FD_CLOEXEC);
+                                       }
                                }
+                               break;
                        }
 
                        linux_cmsg->cmsg_len = LINUX_CMSG_LEN(datalen);

Modified: stable/7/sys/compat/linux/linux_socket.h
==============================================================================
--- stable/7/sys/compat/linux/linux_socket.h    Wed Jun 17 21:49:41 2009        
(r194404)
+++ stable/7/sys/compat/linux/linux_socket.h    Wed Jun 17 21:52:39 2009        
(r194405)
@@ -48,6 +48,7 @@
 #define LINUX_MSG_RST          0x1000
 #define LINUX_MSG_ERRQUEUE     0x2000
 #define LINUX_MSG_NOSIGNAL     0x4000
+#define LINUX_MSG_CMSG_CLOEXEC 0x40000000
 
 /* Socket-level control message types */
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to