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.

net/socket: Break down __sys_setsockopt

Split __sys_setsockopt() into two functions by removing the core
logic into a sub-function (do_sock_setsockopt()). This will avoid
code duplication when doing the same operation in other callers, for
instance.

do_sock_setsockopt() will be called by io_uring setsockopt() command
operation in the following patch.

Signed-off-by: Breno Leitao <leitao@debian.org>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Acked-by: Jakub Kicinski <kuba@kernel.org>
Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20231016134750.1381153-4-leitao@debian.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Breno Leitao and committed by
Jens Axboe
1406245c 3f31e0d1

+27 -14
+2
include/net/sock.h
··· 1867 1867 sockptr_t optval, unsigned int optlen); 1868 1868 int sock_setsockopt(struct socket *sock, int level, int op, 1869 1869 sockptr_t optval, unsigned int optlen); 1870 + int do_sock_setsockopt(struct socket *sock, bool compat, int level, 1871 + int optname, sockptr_t optval, int optlen); 1870 1872 1871 1873 int sk_getsockopt(struct sock *sk, int level, int optname, 1872 1874 sockptr_t optval, sockptr_t optlen);
+25 -14
net/socket.c
··· 2262 2262 return test_bit(SOCK_CUSTOM_SOCKOPT, &sock->flags); 2263 2263 } 2264 2264 2265 - /* 2266 - * Set a socket option. Because we don't know the option lengths we have 2267 - * to pass the user mode parameter for the protocols to sort out. 2268 - */ 2269 - int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval, 2270 - int optlen) 2265 + int do_sock_setsockopt(struct socket *sock, bool compat, int level, 2266 + int optname, sockptr_t optval, int optlen) 2271 2267 { 2272 - sockptr_t optval = USER_SOCKPTR(user_optval); 2273 2268 const struct proto_ops *ops; 2274 2269 char *kernel_optval = NULL; 2275 - int err, fput_needed; 2276 - struct socket *sock; 2270 + int err; 2277 2271 2278 2272 if (optlen < 0) 2279 2273 return -EINVAL; 2280 - 2281 - sock = sockfd_lookup_light(fd, &err, &fput_needed); 2282 - if (!sock) 2283 - return err; 2284 2274 2285 2275 err = security_socket_setsockopt(sock, level, optname); 2286 2276 if (err) 2287 2277 goto out_put; 2288 2278 2289 - if (!in_compat_syscall()) 2279 + if (!compat) 2290 2280 err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname, 2291 2281 optval, &optlen, 2292 2282 &kernel_optval); ··· 2299 2309 optlen); 2300 2310 kfree(kernel_optval); 2301 2311 out_put: 2312 + return err; 2313 + } 2314 + EXPORT_SYMBOL(do_sock_setsockopt); 2315 + 2316 + /* Set a socket option. Because we don't know the option lengths we have 2317 + * to pass the user mode parameter for the protocols to sort out. 2318 + */ 2319 + int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval, 2320 + int optlen) 2321 + { 2322 + sockptr_t optval = USER_SOCKPTR(user_optval); 2323 + bool compat = in_compat_syscall(); 2324 + int err, fput_needed; 2325 + struct socket *sock; 2326 + 2327 + sock = sockfd_lookup_light(fd, &err, &fput_needed); 2328 + if (!sock) 2329 + return err; 2330 + 2331 + err = do_sock_setsockopt(sock, compat, level, optname, optval, optlen); 2332 + 2302 2333 fput_light(sock->file, fput_needed); 2303 2334 return err; 2304 2335 }