* [PATCH RESEND v2 0/2] nfc: llcp: Move to .getsockopt_iter
@ 2026-11-09 13:50 Breno Leitao
2026-11-09 13:50 ` [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 Breno Leitao
2026-11-09 13:50 ` [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter Breno Leitao
0 siblings, 2 replies; 5+ messages in thread
From: Breno Leitao @ 2026-11-09 13:50 UTC (permalink / raw)
To: David Heidelberg, David S. Miller, Jakub Kicinski, Paolo Abeni,
Simon Horman, Eric Dumazet, Eric Dumazet
Cc: oe-linux-nfc, netdev, linux-kernel, sdf.kernel, Breno Leitao,
kernel-team
Continue to convert the protocols to getsockopt_iter callback.
Proto llcp is one of the last to be converted, and it was waiting for
the following fixes to land first, avoiding merge conflicts.
* commit 36812527052c ("nfc: llcp: read llcp_sock->local under the
socket lock in getsockopt")
* commit 99985bfa8336 ("nfc: llcp: avoid userspace overflow on invalid
optlen")
Now that they have landed, let's move llcp to .getsockopt_iter callback
Regarding the whole project migration, this is where we are:
Missing proto_ops migration (as of net-next)
net/can/isotp.c:2064 isotp_ops (.getsockopt = isotp_getsockopt) [1]
net/can/j1939/socket.c:1375 j1939_ops (.getsockopt = j1939_sk_getsockopt) [1]
net/ieee802154/socket.c:411 ieee802154_raw_ops (.getsockopt = sock_common_getsockopt)
net/ieee802154/socket.c:987 ieee802154_dgram_ops (.getsockopt = sock_common_getsockopt)
net/ipv4/af_inet.c:1058 inet_stream_ops (.getsockopt = sock_common_getsockopt)
net/ipv4/af_inet.c:1094 inet_dgram_ops (.getsockopt = sock_common_getsockopt)
net/ipv4/af_inet.c:1126 inet_sockraw_ops (.getsockopt = sock_common_getsockopt)
net/ipv6/af_inet6.c:656 inet6_stream_ops (.getsockopt = sock_common_getsockopt)
net/ipv6/af_inet6.c:692 inet6_dgram_ops (.getsockopt = sock_common_getsockopt)
net/ipv6/raw.c:1290 inet6_sockraw_ops (.getsockopt = sock_common_getsockopt)
net/l2tp/l2tp_ip.c:628 l2tp_ip_ops (.getsockopt = sock_common_getsockopt)
net/l2tp/l2tp_ip6.c:757 l2tp_ip6_ops (.getsockopt = sock_common_getsockopt)
net/mptcp/protocol.c:4753 mptcp_stream_ops (.getsockopt = sock_common_getsockopt)
net/mptcp/protocol.c:4862 mptcp_v6_stream_ops (.getsockopt = sock_common_getsockopt)
net/phonet/socket.c:451 phonet_stream_ops (.getsockopt = sock_common_getsockopt)
net/sctp/ipv6.c:1047 inet6_seqpacket_ops (.getsockopt = sock_common_getsockopt)
net/sctp/protocol.c:1106 inet_seqpacket_ops (.getsockopt = sock_common_getsockopt)
net/smc/af_smc.c:3345 smc_sock_ops (.getsockopt = smc_getsockopt)
net/smc/smc_inet.c:36 smc_inet_stream_ops (.getsockopt = smc_getsockopt)
net/smc/smc_inet.c:84 smc_inet6_stream_ops (.getsockopt = smc_getsockopt)
Link: https://lore.kernel.org/all/20260507-getsock_two_can-v1-0-3c2ae9edfadc@debian.org/ [1]
Signed-off-by: Breno Leitao <leitao@debian.org>
---
Changes in v2:
- Rebase on net-next, no code change
- Link to v1: https://patch.msgid.link/20260708-getsockopt_phase3-v1-0-d8394f2fc554@debian.org
---
Breno Leitao (2):
nfc: llcp: widen getsockopt value locals to u32
nfc: llcp: convert to getsockopt_iter
net/nfc/llcp_sock.c | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
---
base-commit: fa5196392691051963726787944db872420dfa75
base-tree: git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git main
change-id: 20260706-getsockopt_phase3-34f7b5eb3e0b
Best regards,
--
Breno Leitao <leitao@debian.org>
^ permalink raw reply [flat|nested] 5+ messages in thread* [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 2026-11-09 13:50 [PATCH RESEND v2 0/2] nfc: llcp: Move to .getsockopt_iter Breno Leitao @ 2026-11-09 13:50 ` Breno Leitao 2026-11-13 17:39 ` Simon Horman 2026-11-09 13:50 ` [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter Breno Leitao 1 sibling, 1 reply; 5+ messages in thread From: Breno Leitao @ 2026-11-09 13:50 UTC (permalink / raw) To: David Heidelberg, David S. Miller, Jakub Kicinski, Paolo Abeni, Simon Horman, Eric Dumazet, Eric Dumazet Cc: oe-linux-nfc, netdev, linux-kernel, sdf.kernel, Breno Leitao, kernel-team nfc_llcp_getsockopt() returns each option as a u32 (written through a (u32 __user *) cast), but the temporary variables are smaller than that, and they are promoted at write side, example: u8 rw; put_user(rw, (u32 __user *) optval) That is fine, but I want to widen the rw/miux/remote_miu locals from u8/u16 to u32 so the following getsockopt_iter conversion can pass their address to copy_to_iter(), which expects an object of the exact width. No functional change. PS: I am sending this as a separated patch to make sure this conversion explicitly reviewable. Signed-off-by: Breno Leitao <leitao@debian.org> --- net/nfc/llcp_sock.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index 1e5ee4bcde684f..adb6e06229b4af 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c @@ -308,8 +308,7 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, struct sock *sk = sock->sk; struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); int len, err = 0; - u16 miux, remote_miu; - u8 rw; + u32 miux, remote_miu, rw; pr_debug("%p optname %d\n", sk, optname); -- 2.53.0-Meta ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 2026-11-09 13:50 ` [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 Breno Leitao @ 2026-11-13 17:39 ` Simon Horman 0 siblings, 0 replies; 5+ messages in thread From: Simon Horman @ 2026-11-13 17:39 UTC (permalink / raw) To: Breno Leitao Cc: David Heidelberg, David S. Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet, oe-linux-nfc, netdev, linux-kernel, sdf.kernel, kernel-team On Mon, Nov 09, 2026 at 05:50:37AM -0800, Breno Leitao wrote: > nfc_llcp_getsockopt() returns each option as a u32 (written through a > (u32 __user *) cast), but the temporary variables are smaller than that, > and they are promoted at write side, example: > > u8 rw; > put_user(rw, (u32 __user *) optval) > > That is fine, but I want to widen the rw/miux/remote_miu locals from > u8/u16 to u32 so the following getsockopt_iter conversion can pass their > address to copy_to_iter(), which expects an object of the exact width. > > No functional change. > > PS: I am sending this as a separated patch to make sure this conversion > explicitly reviewable. > > Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Simon Horman <horms@kernel.org> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter 2026-11-09 13:50 [PATCH RESEND v2 0/2] nfc: llcp: Move to .getsockopt_iter Breno Leitao 2026-11-09 13:50 ` [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 Breno Leitao @ 2026-11-09 13:50 ` Breno Leitao 2026-11-13 17:39 ` Simon Horman 1 sibling, 1 reply; 5+ messages in thread From: Breno Leitao @ 2026-11-09 13:50 UTC (permalink / raw) To: David Heidelberg, David S. Miller, Jakub Kicinski, Paolo Abeni, Simon Horman, Eric Dumazet, Eric Dumazet Cc: oe-linux-nfc, netdev, linux-kernel, sdf.kernel, Breno Leitao, kernel-team Convert nfc_llcp_getsockopt() to the getsockopt_iter proto_ops callback. It takes a sockopt_t and writes each value with copy_to_iter() instead of a put_user() into optval; the socket layer builds the sockopt_t and copies the length back. The socket lock and optlen validation are unchanged. No functional change. Signed-off-by: Breno Leitao <leitao@debian.org> --- net/nfc/llcp_sock.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index adb6e06229b4af..8323a0e6a02ea3 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c @@ -302,21 +302,20 @@ static int nfc_llcp_setsockopt(struct socket *sock, int level, int optname, } static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct nfc_llcp_local *local; struct sock *sk = sock->sk; struct nfc_llcp_sock *llcp_sock = nfc_llcp_sock(sk); + u32 miux, remote_miu, remote_lto, remote_rw, rw; int len, err = 0; - u32 miux, remote_miu, rw; pr_debug("%p optname %d\n", sk, optname); if (level != SOL_NFC) return -ENOPROTOOPT; - if (get_user(len, optlen)) - return -EFAULT; + len = opt->optlen; if (len < 0) return -EINVAL; @@ -337,7 +336,7 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, switch (optname) { case NFC_LLCP_RW: rw = llcp_sock->rw > LLCP_MAX_RW ? local->rw : llcp_sock->rw; - if (put_user(rw, (u32 __user *) optval)) + if (copy_to_iter(&rw, len, &opt->iter_out) != len) err = -EFAULT; break; @@ -346,7 +345,7 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, miux = be16_to_cpu(llcp_sock->miux) > LLCP_MAX_MIUX ? be16_to_cpu(local->miux) : be16_to_cpu(llcp_sock->miux); - if (put_user(miux, (u32 __user *) optval)) + if (copy_to_iter(&miux, len, &opt->iter_out) != len) err = -EFAULT; break; @@ -355,19 +354,21 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, remote_miu = llcp_sock->remote_miu > LLCP_MAX_MIU ? local->remote_miu : llcp_sock->remote_miu; - if (put_user(remote_miu, (u32 __user *) optval)) + if (copy_to_iter(&remote_miu, len, &opt->iter_out) != len) err = -EFAULT; break; case NFC_LLCP_REMOTE_LTO: - if (put_user(local->remote_lto / 10, (u32 __user *) optval)) + remote_lto = local->remote_lto / 10; + if (copy_to_iter(&remote_lto, len, &opt->iter_out) != len) err = -EFAULT; break; case NFC_LLCP_REMOTE_RW: - if (put_user(llcp_sock->remote_rw, (u32 __user *) optval)) + remote_rw = llcp_sock->remote_rw; + if (copy_to_iter(&remote_rw, len, &opt->iter_out) != len) err = -EFAULT; break; @@ -379,8 +380,7 @@ static int nfc_llcp_getsockopt(struct socket *sock, int level, int optname, release_sock(sk); - if (put_user(len, optlen)) - return -EFAULT; + opt->optlen = len; return err; } @@ -966,7 +966,7 @@ static const struct proto_ops llcp_sock_ops = { .listen = llcp_sock_listen, .shutdown = sock_no_shutdown, .setsockopt = nfc_llcp_setsockopt, - .getsockopt = nfc_llcp_getsockopt, + .getsockopt_iter = nfc_llcp_getsockopt, .sendmsg = llcp_sock_sendmsg, .recvmsg = llcp_sock_recvmsg, .mmap = sock_no_mmap, -- 2.53.0-Meta ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter 2026-11-09 13:50 ` [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter Breno Leitao @ 2026-11-13 17:39 ` Simon Horman 0 siblings, 0 replies; 5+ messages in thread From: Simon Horman @ 2026-11-13 17:39 UTC (permalink / raw) To: Breno Leitao Cc: David Heidelberg, David S. Miller, Jakub Kicinski, Paolo Abeni, Eric Dumazet, oe-linux-nfc, netdev, linux-kernel, sdf.kernel, kernel-team On Mon, Nov 09, 2026 at 05:50:38AM -0800, Breno Leitao wrote: > Convert nfc_llcp_getsockopt() to the getsockopt_iter proto_ops callback. > It takes a sockopt_t and writes each value with copy_to_iter() instead of > a put_user() into optval; the socket layer builds the sockopt_t and copies > the length back. The socket lock and optlen validation are unchanged. > > No functional change. > > Signed-off-by: Breno Leitao <leitao@debian.org> Reviewed-by: Simon Horman <horms@kernel.org> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-11-13 17:39 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-11-09 13:50 [PATCH RESEND v2 0/2] nfc: llcp: Move to .getsockopt_iter Breno Leitao 2026-11-09 13:50 ` [PATCH RESEND v2 1/2] nfc: llcp: widen getsockopt value locals to u32 Breno Leitao 2026-11-13 17:39 ` Simon Horman 2026-11-09 13:50 ` [PATCH RESEND v2 2/2] nfc: llcp: convert to getsockopt_iter Breno Leitao 2026-11-13 17:39 ` Simon Horman
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.