Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

Gabriel Krisman Bertazi and committed by
Jens Axboe
d73c1677 4677e788

+22 -16
+2
include/linux/socket.h
··· 453 453 int addrlen); 454 454 extern int __sys_listen(int fd, int backlog); 455 455 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); 456 458 extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr, 457 459 int __user *usockaddr_len, int peer); 458 460 extern int __sys_socketpair(int family, int type, int protocol,
+20 -16
net/socket.c
··· 2127 2127 return __sys_connect(fd, uservaddr, addrlen); 2128 2128 } 2129 2129 2130 + int do_getsockname(struct socket *sock, int peer, 2131 + struct sockaddr __user *usockaddr, int __user *usockaddr_len) 2132 + { 2133 + struct sockaddr_storage address; 2134 + int err; 2135 + 2136 + if (peer) 2137 + err = security_socket_getpeername(sock); 2138 + else 2139 + err = security_socket_getsockname(sock); 2140 + if (err) 2141 + return err; 2142 + err = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, peer); 2143 + if (err < 0) 2144 + return err; 2145 + /* "err" is actually length in this case */ 2146 + return move_addr_to_user(&address, err, usockaddr, usockaddr_len); 2147 + } 2148 + 2130 2149 /* 2131 2150 * Get the remote or local address ('name') of a socket object. Move the 2132 2151 * obtained name to user space. ··· 2154 2135 int __user *usockaddr_len, int peer) 2155 2136 { 2156 2137 struct socket *sock; 2157 - struct sockaddr_storage address; 2158 2138 CLASS(fd, f)(fd); 2159 - int err; 2160 2139 2161 2140 if (fd_empty(f)) 2162 2141 return -EBADF; 2163 2142 sock = sock_from_file(fd_file(f)); 2164 2143 if (unlikely(!sock)) 2165 2144 return -ENOTSOCK; 2166 - 2167 - if (peer) 2168 - err = security_socket_getpeername(sock); 2169 - else 2170 - err = security_socket_getsockname(sock); 2171 - if (err) 2172 - return err; 2173 - 2174 - err = READ_ONCE(sock->ops)->getname(sock, (struct sockaddr *)&address, peer); 2175 - if (err < 0) 2176 - return err; 2177 - 2178 - /* "err" is actually length in this case */ 2179 - return move_addr_to_user(&address, err, usockaddr, usockaddr_len); 2145 + return do_getsockname(sock, peer, usockaddr, usockaddr_len); 2180 2146 } 2181 2147 2182 2148 SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,