aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/open.c2
-rw-r--r--include/linux/file.h1
-rw-r--r--include/linux/socket.h3
-rw-r--r--net/compat.c3
-rw-r--r--net/core/scm.c3
-rw-r--r--net/socket.c4
6 files changed, 10 insertions, 6 deletions
diff --git a/fs/open.c b/fs/open.c
index e6991c1b5874..be6a457f4226 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -855,7 +855,7 @@ EXPORT_SYMBOL(dentry_open);
855/* 855/*
856 * Find an empty file descriptor entry, and mark it busy. 856 * Find an empty file descriptor entry, and mark it busy.
857 */ 857 */
858static int get_unused_fd_flags(int flags) 858int get_unused_fd_flags(int flags)
859{ 859{
860 struct files_struct * files = current->files; 860 struct files_struct * files = current->files;
861 int fd, error; 861 int fd, error;
diff --git a/include/linux/file.h b/include/linux/file.h
index a59001e9ea58..0114fbc78061 100644
--- a/include/linux/file.h
+++ b/include/linux/file.h
@@ -73,6 +73,7 @@ extern struct file * FASTCALL(fget_light(unsigned int fd, int *fput_needed));
73extern void FASTCALL(set_close_on_exec(unsigned int fd, int flag)); 73extern void FASTCALL(set_close_on_exec(unsigned int fd, int flag));
74extern void put_filp(struct file *); 74extern void put_filp(struct file *);
75extern int get_unused_fd(void); 75extern int get_unused_fd(void);
76extern int get_unused_fd_flags(int flags);
76extern void FASTCALL(put_unused_fd(unsigned int fd)); 77extern void FASTCALL(put_unused_fd(unsigned int fd));
77struct kmem_cache; 78struct kmem_cache;
78 79
diff --git a/include/linux/socket.h b/include/linux/socket.h
index fe195c97a89d..f852e1afd65a 100644
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@ -253,6 +253,9 @@ struct ucred {
253 253
254#define MSG_EOF MSG_FIN 254#define MSG_EOF MSG_FIN
255 255
256#define MSG_CMSG_CLOEXEC 0x40000000 /* Set close_on_exit for file
257 descriptor received through
258 SCM_RIGHTS */
256#if defined(CONFIG_COMPAT) 259#if defined(CONFIG_COMPAT)
257#define MSG_CMSG_COMPAT 0x80000000 /* This message needs 32 bit fixups */ 260#define MSG_CMSG_COMPAT 0x80000000 /* This message needs 32 bit fixups */
258#else 261#else
diff --git a/net/compat.c b/net/compat.c
index 9a0f5f2b90c8..d74d82155d78 100644
--- a/net/compat.c
+++ b/net/compat.c
@@ -276,7 +276,8 @@ void scm_detach_fds_compat(struct msghdr *kmsg, struct scm_cookie *scm)
276 err = security_file_receive(fp[i]); 276 err = security_file_receive(fp[i]);
277 if (err) 277 if (err)
278 break; 278 break;
279 err = get_unused_fd(); 279 err = get_unused_fd_flags(MSG_CMSG_CLOEXEC & kmsg->msg_flags
280 ? O_CLOEXEC : 0);
280 if (err < 0) 281 if (err < 0)
281 break; 282 break;
282 new_fd = err; 283 new_fd = err;
diff --git a/net/core/scm.c b/net/core/scm.c
index 292ad8d5ad76..44c4ec2c8769 100644
--- a/net/core/scm.c
+++ b/net/core/scm.c
@@ -228,7 +228,8 @@ void scm_detach_fds(struct msghdr *msg, struct scm_cookie *scm)
228 err = security_file_receive(fp[i]); 228 err = security_file_receive(fp[i]);
229 if (err) 229 if (err)
230 break; 230 break;
231 err = get_unused_fd(); 231 err = get_unused_fd_flags(MSG_CMSG_CLOEXEC & msg->msg_flags
232 ? O_CLOEXEC : 0);
232 if (err < 0) 233 if (err < 0)
233 break; 234 break;
234 new_fd = err; 235 new_fd = err;
diff --git a/net/socket.c b/net/socket.c
index f4530196a70a..b71114250046 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1939,9 +1939,7 @@ asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
1939 total_len = err; 1939 total_len = err;
1940 1940
1941 cmsg_ptr = (unsigned long)msg_sys.msg_control; 1941 cmsg_ptr = (unsigned long)msg_sys.msg_control;
1942 msg_sys.msg_flags = 0; 1942 msg_sys.msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
1943 if (MSG_CMSG_COMPAT & flags)
1944 msg_sys.msg_flags = MSG_CMSG_COMPAT;
1945 1943
1946 if (sock->file->f_flags & O_NONBLOCK) 1944 if (sock->file->f_flags & O_NONBLOCK)
1947 flags |= MSG_DONTWAIT; 1945 flags |= MSG_DONTWAIT;