From nobody Sun Apr 19 08:36:53 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7D2137F75C; Wed, 8 Apr 2026 10:30:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644261; cv=none; b=QsqtFQc+QGwfwBbFbfiBmq7N2pMm2L8c0QqHJwKaeG9JWDu85Vi3eIdBE/RnywEtcVYS7T58lQyjzMMiCuEwPLejF1eLe63jfubXyhQ6N0PhMkg6RlzW8XNr7keGakkdKFw/lV8tYaa3KbtfgJWMtygVtNXHFcU1GQTL5feXBAQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644261; c=relaxed/simple; bh=Z3kqAGj1zvBralU1HC67R+RaKPOjxmuRHQ9FYFkUl2Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Kz02XTRZd1iZCweVyjuTBTerKaGcldfEzYJ1ZbWPhc59GAZ3Elro0v8o4P0tF1q7AngaCsZlEeRlznEHC8xOo+hYy6pGMeBCMNiVtSCMgNOH6LCteI6xmDhAECETYAs6sFadsE66wAMQJGqJ4oBscYLhkBBGO62jfvhYofI56GI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=JVitOMZw; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="JVitOMZw" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=HtRRkzAXU0fkc0Tx+iUTyUu5YP+MGY2ZcOBwtJyH1lk=; b=JVitOMZw8q6rQWdCtOPrdGutrk YSH0+ciKG0cdOw7QJXC+kYJCbcXHaO8kP8Q0BIUCPkY5b6RlIetdT5fJmo9z5ztsDy3i6OWdEWVjA +x78Qu4JIqgKuAvWtlXSXnlNzFsT3Gvx1Tg7j4rZTY+4rl7VSva3Ntaq4EoKPe7hi90JNpzpKo/AT v+6i0HqxXcSPczfpL8Ee09yn2ILsgJKWfYDKobWTXWKSPLXvQedhvPOoGQvPRj7XUxXw8ZQfDnV5g ueRy2683pSrIs1XQWYOXEst4z+puYmwCVeFAByRVHOHvxRo6noKtz+Zl1U9K1YniUFBxzG5gBr9RB 8Hw59Cag==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wAQBM-008MDm-1b; Wed, 08 Apr 2026 10:30:48 +0000 From: Breno Leitao Date: Wed, 08 Apr 2026 03:30:29 -0700 Subject: [PATCH net-next v3 1/4] net: add getsockopt_iter callback to proto_ops Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260408-getsockopt-v3-1-061bb9cb355d@debian.org> References: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> In-Reply-To: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Kuniyuki Iwashima , Willem de Bruijn , metze@samba.org, axboe@kernel.dk, Stanislav Fomichev Cc: io-uring@vger.kernel.org, bpf@vger.kernel.org, netdev@vger.kernel.org, Linus Torvalds , linux-kernel@vger.kernel.org, kernel-team@meta.com, Breno Leitao X-Mailer: b4 0.16-dev-453a6 X-Developer-Signature: v=1; a=openpgp-sha256; l=2673; i=leitao@debian.org; h=from:subject:message-id; bh=Z3kqAGj1zvBralU1HC67R+RaKPOjxmuRHQ9FYFkUl2Q=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBp1i5NHj9Xl1AjkU+gDhoHhigNX4piORFmHvHzF ggEMJO/kDGJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCadYuTQAKCRA1o5Of/Hh3 bZSAD/9mexa9BnbBzpMw7Rr4ZVS3NFpB7NDeynnsM7sUiVPrOWAkPo7rlbcancrXJlCfNSSFMz/ wegWUoI5sfK1KiK624x/DnenCu1IrLLre6ZIO+sv3DStjCM1JHwMyXLlptxNHUytis6/FI+JwBl 63GrFn9+9C+kIKu/5cTVJla7X4p5BZsqWV+0G94G6Efj6cX0UxdSqX+PPv7fwOPleg7ATdzY2YW GNo4x11F668/k1OMm6XXkUYJhhN18yblY26UUwSZLvXDGgJ0m2lPeDwHUS3jOb8CJVjmS6YM/hf g5qYCUyasNkav3spTD2jbtIKBXk/8HZ3TpZaZoE07yIQ2W81WLKYQ9IyzgNGJDrD/hlr6jbZfRJ BBEfIJ349WxsyWKylxO/KuV93u6i/d8qrnT+L04Lck/XL8EpMO6aZ7PSPnRAydlmLkC/qcEpCU8 KQi2uWvvQM1aILFEB+xwjQ2DJtyLV2YRvg2EZd4nzddAh9NQSKw7UdKsDiFwO7BIjeqpKLhP4rB YdKGKUfI8UGUm3LEuu9t1LEWl66XudjUpMd/DbpDOA36tSR8R4h2ZB6X5X+r7/gTzN8LVT7/z6C 0Y0W0GHoNKs/NPS5OePYv3YTiq5z6p1kMiefLqcsEcYEMc+nOYXGu5/ncz8qR+XQ07y3WY3Xk9P +RmIb6YyDfzILLg== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Add a new getsockopt_iter callback to struct proto_ops that uses sockopt_t, a type-safe wrapper around iov_iter. This provides a clean interface for socket option operations that works with both user and kernel buffers. The sockopt_t type encapsulates an iov_iter and an optlen field. The optlen field, although not suggested by Linus, serves as both input (buffer size) and output (returned data size), allowing callbacks to return random values independent of the bytes written via copy_to_iter(), so, keep it separated from iov_iter.count. This is preparatory work for removing the SOL_SOCKET level restriction from io_uring getsockopt operations. Keep in mind that both iter_out and iter_in always point to the same data at all times, and we just have two of them to make the callback implementation sane. Suggested-by: Linus Torvalds Signed-off-by: Breno Leitao Acked-by: Stanislav Fomichev --- include/linux/net.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/linux/net.h b/include/linux/net.h index a8e818de95b33..fdd48d5c94441 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -23,9 +23,30 @@ #include #include #include +#include =20 #include =20 +/** + * struct sockopt - socket option value container + * @iter_in: iov_iter for reading optval with the content from the caller. + * Use copy_from_iter() given this iov direction is ITER_SOURCE + * @iter_out: iov_iter for protocols to update optval data to userspace + * Use _copy_to_iter() given iov direction is ITER_DEST + * @optlen: serves as both input (buffer size) and output (returned data s= ize). + * + * Type-safe wrapper for socket option data that works with both + * user and kernel buffers. + * + * The optlen field allows callbacks to return a specific length value + * independent of the bytes written via copy_to_iter(). + */ +typedef struct sockopt { + struct iov_iter iter_in; + struct iov_iter iter_out; + int optlen; +} sockopt_t; + struct poll_table_struct; struct pipe_inode_info; struct inode; @@ -192,6 +213,8 @@ struct proto_ops { unsigned int optlen); int (*getsockopt)(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen); + int (*getsockopt_iter)(struct socket *sock, int level, + int optname, sockopt_t *opt); void (*show_fdinfo)(struct seq_file *m, struct socket *sock); int (*sendmsg) (struct socket *sock, struct msghdr *m, size_t total_len); --=20 2.52.0 From nobody Sun Apr 19 08:36:53 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3FD137B41E; Wed, 8 Apr 2026 10:31:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644266; cv=none; b=i6nzqUmj83vSvdE7V+6Rx2osY5JamrI9qiHzKYtGL4Z18QCbh3CPeWxyMxXJcJGGk3nEEuc/I0MAuwy+vu/AgccU6xN5NSAbGFI8Ey1HjnoYwX4J9Xw4VFSWbxRxCZXRBUC/dFPdHn6k5O/sfpi4G1JxS/Gyj2h6ayBy08LPSDo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644266; c=relaxed/simple; bh=pOesKuhudD+8zt+CMHqClMhFbjEUPseOmhGjEs6pHgA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PDSrYoRSqnIYqwJFJlT4RvruCxmN1l3G3z6iBUNVKiy+hgLpE+tc26QPveyEEC43wJGxukgoGMugQyD/tW3h2ypY8lbwMR4sY8s3ZLtX1eGn3o8/KUwUaPpH/MBRktIrx2OSoFUb/Yw/qgz++/+8ncYzaegy3KCKX3Hq5xQ+NHU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=HBw0OcFy; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="HBw0OcFy" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=j3sXh234yYQ0MK964QNxt3wLmUNhN01YHWe58GIc47Q=; b=HBw0OcFyK3w38tJfgCBbhV/RnJ 2krVQYopG2iUZxJasZBE/Oy1P2bc2pq1RVhC3NkI4Qjo41BIMU9bQyLGHhw1vmwKbsYhWpn/hjF6F y6W6K6kW2p2JqlMsn2HwN8igzEVShqgBAdVNkgFxnTYh0Wjm9PdUXihvxUBQsyMdoKqyJm0Ey90vq +oeaiqKCPE5aXopag4E/KyB50MJbkNl9VVxVhXKZcTL6F35E48eBJ/z1dl9z5j2NX8t0xWv9+dIhu KhpZoP0lSAxB9kn63EnIg6m8hz5XOiUywWUa81znIVP7DhEjgnFluC8YZ33+nqhC4FZC2slciV+eg 3uTjf2Gw==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wAQBR-008ME4-08; Wed, 08 Apr 2026 10:30:53 +0000 From: Breno Leitao Date: Wed, 08 Apr 2026 03:30:30 -0700 Subject: [PATCH net-next v3 2/4] net: call getsockopt_iter if available Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260408-getsockopt-v3-2-061bb9cb355d@debian.org> References: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> In-Reply-To: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Kuniyuki Iwashima , Willem de Bruijn , metze@samba.org, axboe@kernel.dk, Stanislav Fomichev Cc: io-uring@vger.kernel.org, bpf@vger.kernel.org, netdev@vger.kernel.org, Linus Torvalds , linux-kernel@vger.kernel.org, kernel-team@meta.com, Breno Leitao X-Mailer: b4 0.16-dev-453a6 X-Developer-Signature: v=1; a=openpgp-sha256; l=4599; i=leitao@debian.org; h=from:subject:message-id; bh=pOesKuhudD+8zt+CMHqClMhFbjEUPseOmhGjEs6pHgA=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBp1i5N/XtgR1BS+9k8hmc7RUdjCimv1CtkLELse /WYkEfGTSSJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCadYuTQAKCRA1o5Of/Hh3 bWDHD/4vlrMvc/oNjL5ysHzc/csEMzRjhtG1l+EOFABmIl07keWEhShr9wJsy/WZRqc3wrj44Yk 38biaVCH5H9U2hPc90nvi++9DmGjn9GK+KTVNxbrQ9wUWgZSv6K53zU/hVETjAQxtReWpMZbNrQ AuiuQEr9i7GnRBSt677xIj62uU/sUP9Z396AIvL7n4oDklkhNbxnB0lv+J1AAuHiBjgrfoImkvy kIWAZyu7PGH6CU4fb0rzLKH+7Sryd1BHte07qE1fyLqxj0lszVb+ovfzUt6pJNUw6tfAoggp/Yg n9R/691XFOUrUW6boaEzEayUGckwGwRomVo9eE2qT0DyJMkJH32JTvxXemeQkPG8kL2jW6HIpEE +Dg9512nFz7ih0tmM2IJCxEo9hGGCOatvIuPMHZ7udT9sQknnjVO+UaBK8U4D9OAoaPKFynj81e Tuf4IH6P5tKtQRAoEEDjJpykaYiyiunKVwPhD3EpYN6aarpGf/Xsg7a/0v2jTVDoxS7Jv6aDV4K nFpT4wpN1Gnv4JvwfN5qGDsItejRc29p5Ox6WnpUWJkcHo0d8+IkJQk8RZ89mg7G9PichhHsx6n b4q/vlIiu+OhITeq9v4iqEI1WzNN/vKGaRbGUAZYIUGJ9vJX47HcIkEgKIFjQDk/3wW5V10+SCu 5N2jGCaWY3mV0lQ== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Update do_sock_getsockopt() to use the new getsockopt_iter callback when available. Add do_sock_getsockopt_iter() helper that: 1. Reads optlen from user/kernel space 2. Initializes a sockopt_t with the appropriate iov_iter (kvec for kernel, ubuf for user buffers) and sets opt.optlen 3. Calls the protocol's getsockopt_iter callback 4. Writes opt.optlen back to user/kernel space The optlen is always written back, even on failure. Some protocols (e.g. CAN raw) return -ERANGE and set optlen to the required buffer size so userspace knows how much to allocate. The callback is responsible for setting opt.optlen to indicate the returned data size. Important to say that iov_out does not need to be copied back in do_sock_getsockopt(). When optval is not kernel (the userspace path), sockptr_to_sockopt() sets up opt->iter_out as a ITER_DEST ubuf iterator pointing directly at the userspace buffer (optval.user). So when getsockopt_iter implementations call copy_to_iter(..., &opt->iter_out), the data is written directly to userspace =E2=80=94 no intermediate kernel buffer is involved. When optval.is_kernel is true (the in-kernel path, e.g. from io_uring), the kvec points at the already-provided kernel buffer (optval.kernel), so the data lands in the caller's buffer directly via the kvec-backed iterator. In both cases the iterator writes to the final destination in-place at protocol callback. There's nothing to copy back =E2=80=94 only optlen needs= to be written back. Signed-off-by: Breno Leitao Acked-by: Stanislav Fomichev --- net/socket.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/net/socket.c b/net/socket.c index ade2ff5845a0c..a25e513cf0f47 100644 --- a/net/socket.c +++ b/net/socket.c @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -2349,11 +2350,45 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, in= t, optname, INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level, int optname)); =20 +/* + * Initialize a sockopt_t from sockptr optval/optlen, setting up iov_iter + * for both input and output directions. + * It is important to remember that both iov points to the same data, but, + * .iter_in is read-only and .iter_out is write-only by the protocol callb= acks + */ +static int sockptr_to_sockopt(sockopt_t *opt, sockptr_t optval, + sockptr_t optlen, struct kvec *kvec) +{ + int koptlen; + + if (copy_from_sockptr(&koptlen, optlen, sizeof(int))) + return -EFAULT; + + if (koptlen < 0) + return -EINVAL; + + if (optval.is_kernel) { + kvec->iov_base =3D optval.kernel; + kvec->iov_len =3D koptlen; + iov_iter_kvec(&opt->iter_out, ITER_DEST, kvec, 1, koptlen); + iov_iter_kvec(&opt->iter_in, ITER_SOURCE, kvec, 1, koptlen); + } else { + iov_iter_ubuf(&opt->iter_out, ITER_DEST, optval.user, koptlen); + iov_iter_ubuf(&opt->iter_in, ITER_SOURCE, optval.user, + koptlen); + } + opt->optlen =3D koptlen; + + return 0; +} + int do_sock_getsockopt(struct socket *sock, bool compat, int level, int optname, sockptr_t optval, sockptr_t optlen) { int max_optlen __maybe_unused =3D 0; const struct proto_ops *ops; + struct kvec kvec; + sockopt_t opt; int err; =20 err =3D security_socket_getsockopt(sock, level, optname); @@ -2366,15 +2401,28 @@ int do_sock_getsockopt(struct socket *sock, bool co= mpat, int level, ops =3D READ_ONCE(sock->ops); if (level =3D=3D SOL_SOCKET) { err =3D sk_getsockopt(sock->sk, level, optname, optval, optlen); - } else if (unlikely(!ops->getsockopt)) { - err =3D -EOPNOTSUPP; - } else { + } else if (ops->getsockopt_iter) { + err =3D sockptr_to_sockopt(&opt, optval, optlen, &kvec); + if (err) + return err; + + err =3D ops->getsockopt_iter(sock, level, optname, &opt); + + /* Always write back optlen, even on failure. Some protocols + * (e.g. CAN raw) return -ERANGE and set optlen to the + * required buffer size so userspace can discover it. + */ + if (copy_to_sockptr(optlen, &opt.optlen, sizeof(int))) + return -EFAULT; + } else if (ops->getsockopt) { if (WARN_ONCE(optval.is_kernel || optlen.is_kernel, "Invalid argument type")) return -EOPNOTSUPP; =20 err =3D ops->getsockopt(sock, level, optname, optval.user, optlen.user); + } else { + err =3D -EOPNOTSUPP; } =20 if (!compat) --=20 2.52.0 From nobody Sun Apr 19 08:36:53 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF03C3803DB; Wed, 8 Apr 2026 10:31:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644264; cv=none; b=ru+mvb0Pnk05qHtIBQ7xYn3aw5hoikZctMZhfRMYYFvHeVXjOdJe9a31y5yygKFF1bLkAMicHC6E0NvkdWdnKCsoVWR7m1u0ECpFfFtdIWgjSnOhD2ceg+W+u9bb+WPf/h/ovMG36eHaOkuIkU1umdErAb7kaGG+kPhGGm//sJ0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644264; c=relaxed/simple; bh=bAnwf474ats9C/F39HbYDhQ2a4jRPfMKlAC7YLXpf48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=H3ZD6B79R/e4vcNzhp91JGWDhfwtSMID9NT5ISa+B18HAqOfqAlMy2xKAKGJMU65aphs7AfDOjonmIGMQmG4KOkIaUsZ5Hr5JSEzAr5vcT8/dMbMnxmGVSwGIGE03Z8q4Mh+XI4b/kTXTaRw4w0pF7jm2nJDVwuDJre3DpZvens= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=C+cMLpeH; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="C+cMLpeH" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=sDEaI6Lvz2cvHsuIvdFPvtDt+pIQQFQmB6yzCWILEKA=; b=C+cMLpeHCPy4SaXJVMG8YGOQUu P0DhuDnUMwQfDZ3sJnurAbPsn6+q/y4yGm880dL2jvaEyPHnzHFZ4lBWUAyX7ztrhsnlsjNyOPWC9 anGH1Zl7YuilENzpCTuWPG5T7CGrWx8bbbKBYye6AnvT/hnT/ENkXwG7/6H/+pkOQeucYc4K3FKlw TDDtoljEpJb3vflEoMpLstHUxvVPLjM/kWrNRGNt8/eEAxQe2lesXapNay8c5RMR1lIk55nB561Hb vT/EmvSrD8giJPPSEBTggKP3QjrPxcIMj67z+xWXl3Av/g2nJlHy8uJyJsibVlyv498JJnAnetZsu 9bqWK0aQ==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wAQBV-008MEF-1y; Wed, 08 Apr 2026 10:30:57 +0000 From: Breno Leitao Date: Wed, 08 Apr 2026 03:30:31 -0700 Subject: [PATCH net-next v3 3/4] af_packet: convert to getsockopt_iter Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260408-getsockopt-v3-3-061bb9cb355d@debian.org> References: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> In-Reply-To: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Kuniyuki Iwashima , Willem de Bruijn , metze@samba.org, axboe@kernel.dk, Stanislav Fomichev Cc: io-uring@vger.kernel.org, bpf@vger.kernel.org, netdev@vger.kernel.org, Linus Torvalds , linux-kernel@vger.kernel.org, kernel-team@meta.com, Breno Leitao X-Mailer: b4 0.16-dev-453a6 X-Developer-Signature: v=1; a=openpgp-sha256; l=2610; i=leitao@debian.org; h=from:subject:message-id; bh=bAnwf474ats9C/F39HbYDhQ2a4jRPfMKlAC7YLXpf48=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBp1i5N/OYD+4vKRcZXdFyIXfM++jE47P6zmYLkU CnNZ8f1jeiJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCadYuTQAKCRA1o5Of/Hh3 bccuD/wLiCk4QokKOoiqYW6cXyWar1nKhJh/kX3OVg8uz3cYNKNJDPXBmXcw+D+LQdWce2BQ2uf lYZ0PKEoyLK0c2M7Y/93z7lFPo2dDcZP8rGVkF2Ungwt6jRDIGgfS2b6Tw83+i8WOwOawkzKM8A buA9DWAskLI1M59IaXZp7LB1DSVHLD5vJ2BasoWpgyv7JghpF2HDkHxJYCiSI0ntoBN+YAIZaoU bq/u6LMbrb9rMPRgsPrf/yHlD5F2AVDs8UZz9r1cPH1IL4GvuY0yTqqjgQAQtyE1NYayxg3KC6F IUC8iaZqGkMqW0VJpdAg7VWNaQKj1vIgArrCqGFk1VAMIGA7UhQo3Y3lni2Ou94/YzmfuBgZVW4 85tj+SRc2TAB88WAeq+T+UF31YGHVLMvMzi/wE3+Sbo0LuNlWX1nOrhW13eRB0hSUJW9y++bZDk 3zgdIeJ27x+01lFTFzJ3Hlu4mRt/NKjAQqBcn+kfzxT1SCFrq8MCSyTGDQAsNh5EnDpR88x7cx4 wfk59AY4hFtsNAaJ0eHpm4xnZK0zJ1/nzFwEn+d1aj9RScWEvgbPWUosEYPKZssF4/7t9w+x+Qz 0RKgVA+fIdXGClcRKtcCV+fTF9VvO8QQ9f8brfTwq6JAAZntQYHTg+n/e9XOx0CQ4Qe8ea6FSK/ ehL1wzYBWpFqD2Q== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert AF_PACKET'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() - For PACKET_HDRLEN which reads from optval: use opt->iter_in with copy_from_iter() for the input read, then the common opt->iter_out copy_to_iter() epilogue handles the output Signed-off-by: Breno Leitao Acked-by: Stanislav Fomichev --- net/packet/af_packet.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index bb2d88205e5a6..1da78b6ad3d5f 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -49,6 +49,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt =20 #include +#include #include #include #include @@ -4051,7 +4052,7 @@ packet_setsockopt(struct socket *sock, int level, int= optname, sockptr_t optval, } =20 static int packet_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { int len; int val, lv =3D sizeof(val); @@ -4065,8 +4066,7 @@ static int packet_getsockopt(struct socket *sock, int= level, int optname, if (level !=3D SOL_PACKET) return -ENOPROTOOPT; =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D opt->optlen; =20 if (len < 0) return -EINVAL; @@ -4115,7 +4115,7 @@ static int packet_getsockopt(struct socket *sock, int= level, int optname, len =3D sizeof(int); if (len < sizeof(int)) return -EINVAL; - if (copy_from_user(&val, optval, len)) + if (copy_from_iter(&val, len, &opt->iter_in) !=3D len) return -EFAULT; switch (val) { case TPACKET_V1: @@ -4171,9 +4171,8 @@ static int packet_getsockopt(struct socket *sock, int= level, int optname, =20 if (len > lv) len =3D lv; - if (put_user(len, optlen)) - return -EFAULT; - if (copy_to_user(optval, data, len)) + opt->optlen =3D len; + if (copy_to_iter(data, len, &opt->iter_out) !=3D len) return -EFAULT; return 0; } @@ -4672,7 +4671,7 @@ static const struct proto_ops packet_ops =3D { .listen =3D sock_no_listen, .shutdown =3D sock_no_shutdown, .setsockopt =3D packet_setsockopt, - .getsockopt =3D packet_getsockopt, + .getsockopt_iter =3D packet_getsockopt, .sendmsg =3D packet_sendmsg, .recvmsg =3D packet_recvmsg, .mmap =3D packet_mmap, --=20 2.52.0 From nobody Sun Apr 19 08:36:53 2026 Received: from stravinsky.debian.org (stravinsky.debian.org [82.195.75.108]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9A32D37F018; Wed, 8 Apr 2026 10:31:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=82.195.75.108 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644271; cv=none; b=IkcbT+IIlHJc2GJInzSWbdDDqLNoDxJqcUBsq3CJuikhKWdilyi8Uz4COgmXwG7XtTLrcZ2kRFOE8blzeY9RbjpGiO2EPlEALFllUHYevXpCv4/yn7BiNoT5Dfj35BDCI9dNuqpMYbn1FnqV/BYRN11iIfyjWNgOgCw696tanGY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775644271; c=relaxed/simple; bh=ob+hbsa5gaZ2FLIvbFGSmZclTDNKFYEONGlciwWTcrs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LrpCL7XlZQ+fi1wKpKbz2AAJU3Y0EHsOQuIbfoOyxMTuyt74Bow+hvHueheyGEi70FpwNo11DTAIOpvkoAb6bWHQEVk0SmfpBDKgm23O7y8T5yzrNoY6X72c53VmdnGX6WS5PetU9/DLV4b1DsHFbwwmuwklGDk7m3+PhouvLMs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org; spf=none smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=LyZ4perh; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=debian.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b="LyZ4perh" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=debian.org; s=smtpauto.stravinsky; h=X-Debian-User:Cc:To:In-Reply-To:References: Message-Id:Content-Transfer-Encoding:Content-Type:MIME-Version:Subject:Date: From:Reply-To:Content-ID:Content-Description; bh=PNxblEMqB4KhPBmYKCSvHUph+B8wcGo1Xxvt6/jg+/Y=; b=LyZ4perhYBsBCH2dGqGUqhVW8e 92+aodKcuukx6WcViZboHFXjpjfi/pRXXVPq0uRgNvyX70zqhpzn3avmKKG1wYptu54XyLb4YedRF chXr1R8FwbPWuqWWP7Pl5WMg/3zgl7+sUrj04/FgZX5vrj4i5EWHJXM7pAwSDInIuprSqoHpCyHxV xT9TrXRhmpWO9aIs2z9P1PHeZzoNu5UBTuYIVyw2EG7QQ6IT7cmsVdLuyZns+9Sv9TO7cJS2gM47u gCAaNqgU5mxzLuD5YP0cG1P7kUxpLtUuxgGPInQmdBgkRX2Sg0VA8sbg8TKxA4zwHTWWRJTz4ypBY RhJLZgQA==; Received: from authenticated user by stravinsky.debian.org with esmtpsa (TLS1.3:ECDHE_X25519__RSA_PSS_RSAE_SHA256__AES_256_GCM:256) (Exim 4.96) (envelope-from ) id 1wAQBa-008MEP-1M; Wed, 08 Apr 2026 10:31:02 +0000 From: Breno Leitao Date: Wed, 08 Apr 2026 03:30:32 -0700 Subject: [PATCH net-next v3 4/4] can: raw: convert to getsockopt_iter Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260408-getsockopt-v3-4-061bb9cb355d@debian.org> References: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> In-Reply-To: <20260408-getsockopt-v3-0-061bb9cb355d@debian.org> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Kuniyuki Iwashima , Willem de Bruijn , metze@samba.org, axboe@kernel.dk, Stanislav Fomichev Cc: io-uring@vger.kernel.org, bpf@vger.kernel.org, netdev@vger.kernel.org, Linus Torvalds , linux-kernel@vger.kernel.org, kernel-team@meta.com, Breno Leitao X-Mailer: b4 0.16-dev-453a6 X-Developer-Signature: v=1; a=openpgp-sha256; l=3570; i=leitao@debian.org; h=from:subject:message-id; bh=ob+hbsa5gaZ2FLIvbFGSmZclTDNKFYEONGlciwWTcrs=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBp1i5NKMEdYHx3wGg7Qa4vX7iAivyNKvTyGmjC/ 1MCC9Vd3omJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCadYuTQAKCRA1o5Of/Hh3 bY5ID/0QQwWLPW/sgiLSkESx/sudB1CI0N5EBltNaZhMUyskNxF0k2Gw835et7QDMWgo2GzycUi +SQUpbBYztTxkQgLa56yuW16T41e5VaKKTB4bj8e9MtLyTWn2gETp5/nt4E2i3aZPe3CeMR84wZ kDgolqoOwr9qGyN26yEY+92W4E0XaOCI29AP2sxKOAIRBADKGIlaAfihBteN3lkg9i8iHIFltjF NY1Xs+p5uhIKYFD7R4Wuj6YzCvWiio6SE+Rkbm7Gdz3wmwbMmqGcNvsoBUXq7ICG/38hduHtfzn ZgfzPWuXsfLhi1N9/NGC8TKyl0OWADXgEjQFx++3KrHHGcv9ecY4DPB5lxFTf2sf1wGP8Zx0+lF eOBrHWnK2i+6QpMRARyFP0jQqw9AXrciDxie5dEps42klrnIx9zufvK9bhPR4lnd1sl2thGot6o Z0eafJOmoYBzZ/IixnFRGmAEp/K83CwUJit0k1AWMkDgnYHuKgJvW4IE22CHLT3Rz3omNbha1MW q18Gaitf3kf4SHx54NXTNK5TVjSdIVPlRpsdpm1b2LT0UH789u3hbXHA2cRhs2JF8SgS9gAv0gQ eVMrybya7ngENB/cSe1qhMu67Y/T55QRGwSakdtuIuc6E0DrovsSq3x7J9kbLKdT1NeHPuk773R 7yleGiMqVR8laYw== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert CAN raw 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 copy_to_user() - For CAN_RAW_FILTER and CAN_RAW_XL_VCID_OPTS: on -ERANGE, set opt->optlen to the required buffer size. The wrapper writes this back to userspace even on error, preserving the existing API that lets userspace discover the needed allocation size. Signed-off-by: Breno Leitao Acked-by: Stanislav Fomichev --- net/can/raw.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/net/can/raw.c b/net/can/raw.c index eee244ffc31ec..6f9ef867a13f2 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -760,7 +760,7 @@ static int raw_setsockopt(struct socket *sock, int leve= l, int optname, } =20 static int raw_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk =3D sock->sk; struct raw_sock *ro =3D raw_sk(sk); @@ -770,8 +770,7 @@ static int raw_getsockopt(struct socket *sock, int leve= l, int optname, =20 if (level !=3D SOL_CAN_RAW) return -EINVAL; - if (get_user(len, optlen)) - return -EFAULT; + len =3D opt->optlen; if (len < 0) return -EINVAL; =20 @@ -787,12 +786,12 @@ static int raw_getsockopt(struct socket *sock, int le= vel, int optname, if (len < fsize) { /* return -ERANGE and needed space in optlen */ err =3D -ERANGE; - if (put_user(fsize, optlen)) - err =3D -EFAULT; + opt->optlen =3D fsize; } else { if (len > fsize) len =3D fsize; - if (copy_to_user(optval, ro->filter, len)) + if (copy_to_iter(ro->filter, len, + &opt->iter_out) !=3D len) err =3D -EFAULT; } } else { @@ -801,7 +800,7 @@ static int raw_getsockopt(struct socket *sock, int leve= l, int optname, release_sock(sk); =20 if (!err) - err =3D put_user(len, optlen); + opt->optlen =3D len; return err; } case CAN_RAW_ERR_FILTER: @@ -845,16 +844,16 @@ static int raw_getsockopt(struct socket *sock, int le= vel, int optname, if (len < sizeof(ro->raw_vcid_opts)) { /* return -ERANGE and needed space in optlen */ err =3D -ERANGE; - if (put_user(sizeof(ro->raw_vcid_opts), optlen)) - err =3D -EFAULT; + opt->optlen =3D sizeof(ro->raw_vcid_opts); } else { if (len > sizeof(ro->raw_vcid_opts)) len =3D sizeof(ro->raw_vcid_opts); - if (copy_to_user(optval, &ro->raw_vcid_opts, len)) + if (copy_to_iter(&ro->raw_vcid_opts, len, + &opt->iter_out) !=3D len) err =3D -EFAULT; } if (!err) - err =3D put_user(len, optlen); + opt->optlen =3D len; return err; } case CAN_RAW_JOIN_FILTERS: @@ -868,9 +867,8 @@ static int raw_getsockopt(struct socket *sock, int leve= l, int optname, return -ENOPROTOOPT; } =20 - if (put_user(len, optlen)) - return -EFAULT; - if (copy_to_user(optval, val, len)) + opt->optlen =3D len; + if (copy_to_iter(val, len, &opt->iter_out) !=3D len) return -EFAULT; return 0; } @@ -1077,7 +1075,7 @@ static const struct proto_ops raw_ops =3D { .listen =3D sock_no_listen, .shutdown =3D sock_no_shutdown, .setsockopt =3D raw_setsockopt, - .getsockopt =3D raw_getsockopt, + .getsockopt_iter =3D raw_getsockopt, .sendmsg =3D raw_sendmsg, .recvmsg =3D raw_recvmsg, .mmap =3D sock_no_mmap, --=20 2.52.0