Skip to content

Commit dc2e779

Browse files
krismanaxboe
authored andcommitted
net: Split a __sys_bind helper for io_uring
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]>
1 parent 3b87184 commit dc2e779

File tree

2 files changed

+18
-9
lines changed

2 files changed

+18
-9
lines changed

include/linux/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,8 @@ extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
442442
extern int __sys_socket(int family, int type, int protocol);
443443
extern struct file *__sys_socket_file(int family, int type, int protocol);
444444
extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
445+
extern int __sys_bind_socket(struct socket *sock, struct sockaddr_storage *address,
446+
int addrlen);
445447
extern int __sys_connect_file(struct file *file, struct sockaddr_storage *addr,
446448
int addrlen, int file_flags);
447449
extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,

net/socket.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,20 @@ SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
18221822
return __sys_socketpair(family, type, protocol, usockvec);
18231823
}
18241824

1825+
int __sys_bind_socket(struct socket *sock, struct sockaddr_storage *address,
1826+
int addrlen)
1827+
{
1828+
int err;
1829+
1830+
err = security_socket_bind(sock, (struct sockaddr *)address,
1831+
addrlen);
1832+
if (!err)
1833+
err = READ_ONCE(sock->ops)->bind(sock,
1834+
(struct sockaddr *)address,
1835+
addrlen);
1836+
return err;
1837+
}
1838+
18251839
/*
18261840
* Bind a name to a socket. Nothing much to do here since it's
18271841
* the protocol's responsibility to handle the local address.
@@ -1839,15 +1853,8 @@ int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
18391853
sock = sockfd_lookup_light(fd, &err, &fput_needed);
18401854
if (sock) {
18411855
err = move_addr_to_kernel(umyaddr, addrlen, &address);
1842-
if (!err) {
1843-
err = security_socket_bind(sock,
1844-
(struct sockaddr *)&address,
1845-
addrlen);
1846-
if (!err)
1847-
err = READ_ONCE(sock->ops)->bind(sock,
1848-
(struct sockaddr *)
1849-
&address, addrlen);
1850-
}
1856+
if (!err)
1857+
err = __sys_bind_socket(sock, &address, addrlen);
18511858
fput_light(sock->file, fput_needed);
18521859
}
18531860
return err;

0 commit comments

Comments
 (0)