svn commit: r194405 - in stable/7/sys: . compat/linux contrib/pf
Dmitry Chagin
dchagin at FreeBSD.org
Wed Jun 17 21:52:42 UTC 2009
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 */
More information about the svn-src-stable-7
mailing list