Allow setting FD_CLOEXEC flag for new sockets
Subsystems (2)
PATCH v5 3/5 Allow setting FD_CLOEXEC flag for new sockets
This is a first user of sys_indirect. Several of the socket-related system calls which produce a file handle now can be passed an additional parameter to set the FD_CLOEXEC flag.
include/asm-x86/ia32_unistd.h | 1 + include/linux/indirect.h | 27 +++++++++++++++++++++++++++ net/socket.c | 21 +++++++++++++-------- 3 files changed, 41 insertions(+), 8 deletions(-)
include/linux/indirect.h +27 -0
@@ -1,3 +1,4 @@ +#ifndef INDSYSCALL #ifndef _LINUX_INDIRECT_H#define _LINUX_INDIRECT_H
@@ -13,5 +14,31 @@ +struct { +int flags; + } file_flags; };#define INDIRECT_PARAM (set, name) current->indirect_params.set.name#endif +#else + +/* Here comes the list of system calls which can be called through +sys_indirect. When the list if support system calls is needed the +file including this header is supposed to define a macro "INDSYSCALL" +which adds a prefix fitting to the use. If the resulting macro is +defined we generate a line +case MACRO: +*/ +#if INDSYSCALL (accept) +case INDSYSCALL (accept): +#endif +#if INDSYSCALL (socket) +case INDSYSCALL (socket): +#endif +#if INDSYSCALL (socketcall) +case INDSYSCALL (socketcall): +#endif +#if INDSYSCALL (socketpair) +case INDSYSCALL (socketpair): +#endif + +#endif
include/asm-x86/ia32_unistd.h +1 -0
@@ -12,6 +12,7 @@#define __NR_ia32_exit 1#define __NR_ia32_read 3#define __NR_ia32_write 4 +#define __NR_ia32_socketcall 102#define __NR_ia32_sigreturn 119#define __NR_ia32_rt_sigreturn 173
net/socket.c +13 -8
@@ -344,11 +344,11 @@* but we take care of internal coherence yet. */ -static int sock_alloc_fd (struct file **filep) +static int sock_alloc_fd (struct file **filep,int flags) {int fd; - fd =get_unused_fd (); + fd =get_unused_fd_flags (flags);if (likely (fd >=0 )) {struct file *file =get_empty_filp ();
@@ -391,10 +391,10 @@return 0 ; } -int sock_map_fd (struct socket *sock) +static int sock_map_fd_flags (struct socket *sock,int flags) {struct file *newfile; -int fd =sock_alloc_fd (&newfile); +int fd =sock_alloc_fd (&newfile, flags);if (likely (fd >=0 )) {int err =sock_attach_fd (sock, newfile);
@@ -409,6 +409,11 @@return fd; } +int sock_map_fd (struct socket *sock) +{ +return sock_map_fd_flags (sock,0 ); +} +static struct socket *sock_from_file (struct file *file,int *err) {if (file->f_op == &socket_file_ops)
@@ -1208,7 +1213,7 @@if (retval <0 ) goto out; - retval =sock_map_fd (sock); + retval =sock_map_fd_flags (sock,INDIRECT_PARAM (file_flags, flags));if (retval <0 ) goto out_release;
@@ -1249,13 +1254,13 @@if (err <0 ) goto out_release_both; - fd1 =sock_alloc_fd (&newfile1); + fd1 =sock_alloc_fd (&newfile1,INDIRECT_PARAM (file_flags, flags));if (unlikely (fd1 <0 )) { err = fd1; goto out_release_both; } - fd2 =sock_alloc_fd (&newfile2); + fd2 =sock_alloc_fd (&newfile2,INDIRECT_PARAM (file_flags, flags));if (unlikely (fd2 <0 )) { err = fd2;put_filp (newfile1);
@@ -1411,7 +1416,7 @@*/ __module_get (newsock->ops->owner); - newfd =sock_alloc_fd (&newfile); + newfd =sock_alloc_fd (&newfile,INDIRECT_PARAM (file_flags, flags));if (unlikely (newfd <0 )) { err = newfd;sock_release (newsock);