Skip to content

Commit d73c167

Browse files
krismanaxboe
authored andcommitted
socket: Split out a getsockname helper for io_uring
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>
1 parent 4677e78 commit d73c167

2 files changed

Lines changed: 22 additions & 16 deletions

File tree

include/linux/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,8 @@ extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
453453
int addrlen);
454454
extern int __sys_listen(int fd, int backlog);
455455
extern int __sys_listen_socket(struct socket *sock, int backlog);
456+
extern int do_getsockname(struct socket *sock, int peer,
457+
struct sockaddr __user *usockaddr, int __user *usockaddr_len);
456458
extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
457459
int __user *usockaddr_len, int peer);
458460
extern int __sys_socketpair(int family, int type, int protocol,

net/socket.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,39 +2127,43 @@ SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
21272127
return __sys_connect(fd, uservaddr, addrlen);
21282128
}
21292129

2130-
/*
2131-
* Get the remote or local address ('name') of a socket object. Move the
2132-
* obtained name to user space.
2133-
*/
2134-
int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
2135-
int __user *usockaddr_len, int peer)
2130+
int do_getsockname(struct socket *sock, int peer,
2131+
struct sockaddr __user *usockaddr, int __user *usockaddr_len)
21362132
{
2137-
struct socket *sock;
21382133
struct sockaddr_storage address;
2139-
CLASS(fd, f)(fd);
21402134
int err;
21412135

2142-
if (fd_empty(f))
2143-
return -EBADF;
2144-
sock = sock_from_file(fd_file(f));
2145-
if (unlikely(!sock))
2146-
return -ENOTSOCK;
2147-
21482136
if (peer)
21492137
err = security_socket_getpeername(sock);
21502138
else
21512139
err = security_socket_getsockname(sock);
21522140
if (err)
21532141
return err;
2154-
21552142
err = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, peer);
21562143
if (err < 0)
21572144
return err;
2158-
21592145
/* "err" is actually length in this case */
21602146
return move_addr_to_user(&address, err, usockaddr, usockaddr_len);
21612147
}
21622148

2149+
/*
2150+
* Get the remote or local address ('name') of a socket object. Move the
2151+
* obtained name to user space.
2152+
*/
2153+
int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
2154+
int __user *usockaddr_len, int peer)
2155+
{
2156+
struct socket *sock;
2157+
CLASS(fd, f)(fd);
2158+
2159+
if (fd_empty(f))
2160+
return -EBADF;
2161+
sock = sock_from_file(fd_file(f));
2162+
if (unlikely(!sock))
2163+
return -ENOTSOCK;
2164+
return do_getsockname(sock, peer, usockaddr, usockaddr_len);
2165+
}
2166+
21632167
SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
21642168
int __user *, usockaddr_len)
21652169
{

0 commit comments

Comments
 (0)