Convert CAN ISO-TP socket's getsockopt implementation to use the new getsockopt_iter callback with sockopt_t.
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/can/isotp.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/net/can/isotp.c b/net/can/isotp.c index c48b4a818297e..1c33f09fbd338 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -1500,7 +1500,7 @@ static int isotp_setsockopt(struct socket *sock, int level, int optname, } static int isotp_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk = sock->sk; struct isotp_sock *so = isotp_sk(sk); @@ -1509,8 +1509,7 @@ static int isotp_getsockopt(struct socket *sock, int level, int optname, if (level != SOL_CAN_ISOTP) return -EINVAL; - if (get_user(len, optlen)) - return -EFAULT; + len = opt->optlen; if (len < 0) return -EINVAL; @@ -1544,9 +1543,8 @@ static int isotp_getsockopt(struct socket *sock, int level, int optname, return -ENOPROTOOPT; } - if (put_user(len, optlen)) - return -EFAULT; - if (copy_to_user(optval, val, len)) + opt->optlen = len; + if (copy_to_iter(val, len, &opt->iter_out) != len) return -EFAULT; return 0; } @@ -1718,7 +1716,7 @@ static const struct proto_ops isotp_ops = { .listen = sock_no_listen, .shutdown = sock_no_shutdown, .setsockopt = isotp_setsockopt, - .getsockopt = isotp_getsockopt, + .getsockopt_iter = isotp_getsockopt, .sendmsg = isotp_sendmsg, .recvmsg = isotp_recvmsg, .mmap = sock_no_mmap, -- 2.52.0

