]> Gentwo Git Trees - linux/.git/commitdiff
socket: Split out a getsockname helper for io_uring
authorGabriel Krisman Bertazi <krisman@suse.de>
Tue, 25 Nov 2025 21:18:00 +0000 (16:18 -0500)
committerJens Axboe <axboe@kernel.dk>
Wed, 26 Nov 2025 20:45:23 +0000 (13:45 -0700)
Similar to getsockopt, split out a helper to check security and issue
the operation from the main handler that can be used by io_uring.

Signed-off-by: Gabriel Krisman Bertazi <krisman@suse.de>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
include/linux/socket.h
net/socket.c

index 937fe331ff1ef903c7f0bdfaa39f06fffcdcfdda..8d580074ddea7ed85c28b68081dc571cc9834c7f 100644 (file)
@@ -453,6 +453,8 @@ extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
                         int addrlen);
 extern int __sys_listen(int fd, int backlog);
 extern int __sys_listen_socket(struct socket *sock, int backlog);
+extern int do_getsockname(struct socket *sock, int peer,
+                         struct sockaddr __user *usockaddr, int __user *usockaddr_len);
 extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
                             int __user *usockaddr_len, int peer);
 extern int __sys_socketpair(int family, int type, int protocol,
index 208d92ccf0fb9c439ebfd4df56d8cafa27dd091b..89bac0a17e5a58470b08c2f68dcb66bf4a5e9f64 100644 (file)
@@ -2127,39 +2127,43 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
        return __sys_connect(fd, uservaddr, addrlen);
 }
 
-/*
- *     Get the remote or local address ('name') of a socket object. Move the
- *     obtained name to user space.
- */
-int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
-                     int __user *usockaddr_len, int peer)
+int do_getsockname(struct socket *sock, int peer,
+                  struct sockaddr __user *usockaddr, int __user *usockaddr_len)
 {
-       struct socket *sock;
        struct sockaddr_storage address;
-       CLASS(fd, f)(fd);
        int err;
 
-       if (fd_empty(f))
-               return -EBADF;
-       sock = sock_from_file(fd_file(f));
-       if (unlikely(!sock))
-               return -ENOTSOCK;
-
        if (peer)
                err = security_socket_getpeername(sock);
        else
                err = security_socket_getsockname(sock);
        if (err)
                return err;
-
        err = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, peer);
        if (err < 0)
                return err;
-
        /* "err" is actually length in this case */
        return move_addr_to_user(&address, err, usockaddr, usockaddr_len);
 }
 
+/*
+ *     Get the remote or local address ('name') of a socket object. Move the
+ *     obtained name to user space.
+ */
+int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+                     int __user *usockaddr_len, int peer)
+{
+       struct socket *sock;
+       CLASS(fd, f)(fd);
+
+       if (fd_empty(f))
+               return -EBADF;
+       sock = sock_from_file(fd_file(f));
+       if (unlikely(!sock))
+               return -ENOTSOCK;
+       return do_getsockname(sock, peer, usockaddr, usockaddr_len);
+}
+
 SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
                int __user *, usockaddr_len)
 {