On Fri, May 01, 2026 at 08:52:52AM -0700, Breno Leitao wrote:
> 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 <[email protected]>
> ---
>  net/vmw_vsock/af_vsock.c | 16 +++++++---------
>  1 file changed, 7 insertions(+), 9 deletions(-)
> 
> diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
> index 44037b066a5ff..d4a97eeb596e6 100644
> --- a/net/vmw_vsock/af_vsock.c
> +++ b/net/vmw_vsock/af_vsock.c
> @@ -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,
> 
> -- 
> 2.52.0
> 

Reviewed-by: Bobby Eshleman <[email protected]>

Reply via email to