mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
vsock: convert to getsockopt_iter
Convert AF_VSOCK's getsockopt implementation to use the new getsockopt_iter callback with sockopt_t. The single vsock_connectible_getsockopt() callback is shared by both vsock_stream_ops and vsock_seqpacket_ops, so both proto_ops are updated to use .getsockopt_iter. Key changes: - Replace (char __user *optval, int __user *optlen) with sockopt_t *opt - Use opt->optlen for buffer length (input) and returned size (output) - Use copy_to_iter() instead of put_user()/copy_to_user() Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Bobby Eshleman <bobbyeshleman@meta.com> Acked-by: Stanislav Fomichev <sdf@fomichev.me> Link: https://patch.msgid.link/20260501-getsock_one-v1-2-810ce23ea70e@debian.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
390bf43b77
commit
e21bf72954
|
|
@ -155,6 +155,7 @@
|
|||
#include <linux/random.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/socket.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/sysctl.h>
|
||||
|
|
@ -2091,8 +2092,7 @@ static int vsock_connectible_setsockopt(struct socket *sock,
|
|||
|
||||
static int vsock_connectible_getsockopt(struct socket *sock,
|
||||
int level, int optname,
|
||||
char __user *optval,
|
||||
int __user *optlen)
|
||||
sockopt_t *opt)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
struct vsock_sock *vsk = vsock_sk(sk);
|
||||
|
|
@ -2110,8 +2110,7 @@ static int vsock_connectible_getsockopt(struct socket *sock,
|
|||
if (level != AF_VSOCK)
|
||||
return -ENOPROTOOPT;
|
||||
|
||||
if (get_user(len, optlen))
|
||||
return -EFAULT;
|
||||
len = opt->optlen;
|
||||
|
||||
memset(&v, 0, sizeof(v));
|
||||
|
||||
|
|
@ -2142,11 +2141,10 @@ static int vsock_connectible_getsockopt(struct socket *sock,
|
|||
return -EINVAL;
|
||||
if (len > lv)
|
||||
len = lv;
|
||||
if (copy_to_user(optval, &v, len))
|
||||
if (copy_to_iter(&v, len, &opt->iter_out) != len)
|
||||
return -EFAULT;
|
||||
|
||||
if (put_user(len, optlen))
|
||||
return -EFAULT;
|
||||
opt->optlen = len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2631,7 +2629,7 @@ static const struct proto_ops vsock_stream_ops = {
|
|||
.listen = vsock_listen,
|
||||
.shutdown = vsock_shutdown,
|
||||
.setsockopt = vsock_connectible_setsockopt,
|
||||
.getsockopt = vsock_connectible_getsockopt,
|
||||
.getsockopt_iter = vsock_connectible_getsockopt,
|
||||
.sendmsg = vsock_connectible_sendmsg,
|
||||
.recvmsg = vsock_connectible_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
|
|
@ -2653,7 +2651,7 @@ static const struct proto_ops vsock_seqpacket_ops = {
|
|||
.listen = vsock_listen,
|
||||
.shutdown = vsock_shutdown,
|
||||
.setsockopt = vsock_connectible_setsockopt,
|
||||
.getsockopt = vsock_connectible_getsockopt,
|
||||
.getsockopt_iter = vsock_connectible_getsockopt,
|
||||
.sendmsg = vsock_connectible_sendmsg,
|
||||
.recvmsg = vsock_connectible_recvmsg,
|
||||
.mmap = sock_no_mmap,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user