]> Git Repo - linux.git/commitdiff
net: Split a __sys_bind helper for io_uring
authorGabriel Krisman Bertazi <[email protected]>
Fri, 14 Jun 2024 16:30:44 +0000 (12:30 -0400)
committerJens Axboe <[email protected]>
Wed, 19 Jun 2024 13:57:20 +0000 (07:57 -0600)
io_uring holds a reference to the file and maintains a
sockaddr_storage address.  Similarly to what was done to
__sys_connect_file, split an internal helper for __sys_bind in
preparation to supporting an io_uring bind command.

Reviewed-by: Jens Axboe <[email protected]>
Signed-off-by: Gabriel Krisman Bertazi <[email protected]>
Reviewed-by: Kuniyuki Iwashima <[email protected]>
Acked-by: Jakub Kicinski <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
include/linux/socket.h
net/socket.c

index 89d16b90370bd412c30a755bd1324f5f8c72aad1..b3000f49e9f59f5c59d38fb788aef6d64da7c1d6 100644 (file)
@@ -442,6 +442,8 @@ extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 extern int __sys_socket(int family, int type, int protocol);
 extern struct file *__sys_socket_file(int family, int type, int protocol);
 extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
+extern int __sys_bind_socket(struct socket *sock, struct sockaddr_storage *address,
+                            int addrlen);
 extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
                              int addrlen, int file_flags);
 extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
index e416920e9399ecc3b9196c45b43435a227b3a2c6..fd0714e10cedd117ea41df89fcea9758f4db742f 100644 (file)
@@ -1822,6 +1822,20 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
        return __sys_socketpair(family, type, protocol, usockvec);
 }
 
+int __sys_bind_socket(struct socket *sock, struct sockaddr_storage *address,
+                     int addrlen)
+{
+       int err;
+
+       err = security_socket_bind(sock, (struct sockaddr *)address,
+                                  addrlen);
+       if (!err)
+               err = READ_ONCE(sock->ops)->bind(sock,
+                                                (struct sockaddr *)address,
+                                                addrlen);
+       return err;
+}
+
 /*
  *     Bind a name to a socket. Nothing much to do here since it's
  *     the protocol's responsibility to handle the local address.
@@ -1839,15 +1853,8 @@ int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (sock) {
                err = move_addr_to_kernel(umyaddr, addrlen, &address);
-               if (!err) {
-                       err = security_socket_bind(sock,
-                                                  (struct sockaddr *)&address,
-                                                  addrlen);
-                       if (!err)
-                               err = READ_ONCE(sock->ops)->bind(sock,
-                                                     (struct sockaddr *)
-                                                     &address, addrlen);
-               }
+               if (!err)
+                       err = __sys_bind_socket(sock, &address, addrlen);
                fput_light(sock->file, fput_needed);
        }
        return err;
This page took 0.080451 seconds and 4 git commands to generate.