From nobody Wed Apr 1 20:44:25 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 7E9703DBD61; Wed, 1 Apr 2026 15:45:00 +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=1775058301; cv=none; b=rrENQ1spJQFL8FN6VXY73usmqjbL7/ZSTzzudZqiLL6e1L6H0kRj1pJVAq5Pu7gIrY00jVkHLSaSBLZuLNKSXUIjZ5Tnsc94nYNyGocitHlLdm4tDRARUkaHDYJsgtu9Ia0COwmQ/ovQbVVsYGHa6tGa7TK0oFBgXh6ZNQ7NL5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775058301; c=relaxed/simple; bh=hMYQYT2xvfHqOHl2LFKSxlX6nua5F3CMVTSf2Pf/5bY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=L5Ltk1UMjq/tewMSWq2pHph1p+fcwNqYQpT8O5xEV5OXfSeY9FTC8bZLeyNa477CBlSzoF/EfPInHCMzTx4liIK52VXN2whii44WqBB4UgHgl0KcFSLsQSFoh1c8xoJ0C0jBHZVZg9K7z/O3RozH0kEApkP75dxDqAkP4uCqK7s= 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=i10ik82i; 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="i10ik82i" 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=npBuva6v0+cdBLu8r0x6NARc7OQliddIYu9hiO4ITV8=; b=i10ik82i9R89aKWrfdPwl6L6Su +X2n/CRtUBnTW1DnjOd0Cf9S9kCY3ImEQk3xUAjJPxA/esESxeRstWK9aFSNgvc4RvwdK3wSXtl14 TgHCRvsL3C3a/YvqH+tAbwX1UDAvk7s88KjukqtMCgzG9LxHzgXGAgA26P0JNEZrTJ0hmlAvOkw+V nw022n0dTqAnyrHgMNVkRqMKJSVwd30N8vPmgFtM2YDYfH07G64gli8GmQcitF6g5Ip4Br0Ni4XSm /wnFw1pEZLwoKTUTyGBzWlcZFMa+rClVLfMK9NI4c+N72A72R/3/0YFkA/fhcUroJ8Sz2T9BCDY+M t6MTB3DQ==; 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 1w7xkW-0035cJ-1q; Wed, 01 Apr 2026 15:44:55 +0000 From: Breno Leitao Date: Wed, 01 Apr 2026 08:44:26 -0700 Subject: [PATCH net-next v2 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: <20260401-getsockopt-v2-1-611df6771aff@debian.org> References: <20260401-getsockopt-v2-0-611df6771aff@debian.org> In-Reply-To: <20260401-getsockopt-v2-0-611df6771aff@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=2238; i=leitao@debian.org; h=from:subject:message-id; bh=hMYQYT2xvfHqOHl2LFKSxlX6nua5F3CMVTSf2Pf/5bY=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpzT1tEK2sgVZblXNKllTHeR3jNXo3w+LhuCcK6 Y0/IrdkRCeJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCac09bQAKCRA1o5Of/Hh3 bYLdD/4psx2XNR7NLxe+UBFXYH7K0dirkXXF9WIn/fsl17SyxmSOQhXikX58+JDV3gVSxjc2mTt pvnboSSRYzYa1GUVNkWO7glDn+Nz7QqxQL07LXfZZCD6KlTf3j/gvZbbrN06sACiCZ05XXwsUK3 2SJSafQm2cplIO8WCwJbVFSR61Mebbz1ue/Nma5cXnuLs8nAZrLS+TE3/o5SdARcp6eIHZ9W4Ev yk3qFCjMAWn7Dc7cnDlPmlyGjG4eUrWRMcVajMKEtQ3MoWbAZ8zQc27m/MI6lGIfH8ZnvtyvAdD EYIUaQv828selFCTmOIAAQs/JW4OwNfEj3BFcqbSfvurgZHRJTArjU832WhAXxhdwpwFpscYq9P 3h8PbgZpN+bLIFDwug/mnHTgL2sHgQhy/wtPJ6Yr0OdM7Lb3PHRSmWtt7DHSBlGiee5dsL8YKzG woLD4LxFKxS8K9mTDRDZ1jHypAU+uA23/CvwhsSacriDQ0oCOHqawHQwKiUyWFgVixYhudFEHRs L7Pbbl36+E7rB7x8VMXIAM4JugIe+Huf4FyV6QSJU3BigQHvNl9HfIai6V/1VMMvduzwLixddRa zNPbPbSFOI1n54816cgxwcUsIqK5N5VhAgog+IwZhm/hk0F2e+cVcjynX7URMeO1LMW+/6Q30hF hTiGobipofUDJkw== 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. Suggested-by: Linus Torvalds Signed-off-by: Breno Leitao --- include/linux/net.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/include/linux/net.h b/include/linux/net.h index a8e818de95b3..9dde75b4bf77 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -23,9 +23,26 @@ #include #include #include +#include =20 #include =20 +/** + * struct sockopt - socket option value container + * @iter: iov_iter for reading/writing option data + * @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; + int optlen; +} sockopt_t; + struct poll_table_struct; struct pipe_inode_info; struct inode; @@ -192,6 +209,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 Wed Apr 1 20:44:25 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 9CF593644CA; Wed, 1 Apr 2026 15:45:04 +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=1775058305; cv=none; b=l/T//su3dZgtmsau54/b5Pih5r8TLis2julrjlHpdSEmw3wBYLxtYUF+RmBrH09uqseqQQ4XSZk9GCDwnEGyRt7lZShoxJQtkvTMmj8ECsceV0BcnNvoXSYVz99mT6qcZR7XDwttGSbb6JXM5uhqa0oMXNSYnWxNjnLY7Emrr6s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775058305; c=relaxed/simple; bh=Wy4BH2uTAnsO+wh6l7vn7Fq5hp6ayWXU/wA564vnaNI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gF5Lf4xDl9kE9pnlwuHFkE64LWxL40oozuzkTXoRfg0U3SsPYCQJW+KK7VAExUJ/ajLgcXzo/8m8qePu3g7bSx0r/bka7q5IJi37iIjKo5WQQ9Fz14WT5p08rmWL5Wq8w7o2B0BzJhSzw1vMJ2B2J45eg75bwb2EMUAJ50VgV1I= 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=RHsHg+44; 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="RHsHg+44" 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=6ku4rL1qubigHGGSJXU5arZMdC5XOO4IXDE/SU6GV9o=; b=RHsHg+44jmd1BPeBoizNvI6wWf Yd0ef4x53i8/tOgtl4kUPe4HM8j3FInyjlx8xa3O9FU+wxOKflJL5aMwIOQB9zWdWMptYZWiEe5Nm 8e/ibIZn6R0ZeXmTnpthSiMg3ouJrQjY7ZfesqvMy0McutG4J9VAvY4VCRwiJSyrpq5vg8PNQ3Ki3 jPRADZ6/nqJ5Yy69klVv4PJse/t617tu6j39VHebJSJ2ntIv9puOmON5bEz4NzW0xVwl46FxDilsB atg5V17guJM5dE1KZngIYasTLwf+jnm95YTMIwmDieGjWPOf3aHNV7L4xXZqUSDxv/JNJfTH3LpIh KptLVS0Q==; 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 1w7xkb-0035cP-0D; Wed, 01 Apr 2026 15:44:59 +0000 From: Breno Leitao Date: Wed, 01 Apr 2026 08:44:27 -0700 Subject: [PATCH net-next v2 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: <20260401-getsockopt-v2-2-611df6771aff@debian.org> References: <20260401-getsockopt-v2-0-611df6771aff@debian.org> In-Reply-To: <20260401-getsockopt-v2-0-611df6771aff@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=3399; i=leitao@debian.org; h=from:subject:message-id; bh=Wy4BH2uTAnsO+wh6l7vn7Fq5hp6ayWXU/wA564vnaNI=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpzT1tDy56mQ3kIeRy5y9WTr2DAPeuz+7MI6QKO BJf/GAU0f+JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCac09bQAKCRA1o5Of/Hh3 bXfKD/9UNOXyXUJ/K+AqH0hnslwFZe6hAmuBsde6dZiZVCecuxYgfLAGykHYAmmqadiSW8HxWak CV1E5RYTKYteQJEASvJBP4QoysUoVEIgpJV1EOi+N1EoI93nQExLG2BYxi4yJ0dnQ4g4DQGOiuo uYCRaPRSotTdoGoa2COZKoCkLHgLjlslzmDUIEiceUgiTT3D72oFUiKtihCxl13NZGErqCNZoaV 6zXuxyMMxhHcc6MvxLLxVzEKwHbZnNOPqDo4yxZ4mD9/TNpceNr+wp5x2zfwdi7/zckH7g3Vmiq eg7fLBudM4r2BHnEy4srtXO/2vLcV+0CFtARVp8LK+OdIXu3+Y7Rv81aBSOkKUmgd+W+p93yElU jf9Um/U5X+PwfCb5RJQDCkdO0vD5BiryrwJczA8m0guQx62pZFQmm0a59Z46pHnv4mnfK5KWzCJ tVT7rKPvyeB8AYsO+J+SIhWI12S6SW00eXi74fzdtf7PRnPYHPRQ4efQuSO2Qxm3c13sjfdQ4qv RkO0rmsqfQmS2br213H9dYLfNwK9BQilo7keG0fas4Zc3oxHcynup9ZCfBHTq+2so3Uj+F05jfz +DL8ldlYqfk68oYE4SjWvcB1mDseDomU4xU1krdlGNY27E1xUJdyJXh8/RmT+xsRptuYC5/Stj0 s1B2E7Fa1852q0w== 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. Signed-off-by: Breno Leitao --- net/socket.c | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/net/socket.c b/net/socket.c index ade2ff5845a0..4a74a4aa1bb4 100644 --- a/net/socket.c +++ b/net/socket.c @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -2349,6 +2350,44 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int= , optname, INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level, int optname)); =20 +static int do_sock_getsockopt_iter(struct socket *sock, + const struct proto_ops *ops, int level, + int optname, sockptr_t optval, + sockptr_t optlen) +{ + struct kvec kvec; + sockopt_t opt; + int koptlen; + int err; + + if (copy_from_sockptr(&koptlen, optlen, sizeof(int))) + return -EFAULT; + + if (optval.is_kernel) { + kvec.iov_base =3D optval.kernel; + kvec.iov_len =3D koptlen; + iov_iter_kvec(&opt.iter, ITER_DEST, &kvec, 1, koptlen); + } else { + iov_iter_ubuf(&opt.iter, ITER_DEST, optval.user, koptlen); + } + opt.optlen =3D koptlen; + + /* iter is initialized as ITER_DEST. Callbacks that need to read + * from optval (e.g. PACKET_HDRLEN) must flip data_source to + * ITER_SOURCE, then restore ITER_DEST before writing back. + */ + 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 knows how much to allocate. + */ + if (copy_to_sockptr(optlen, &opt.optlen, sizeof(int))) + return -EFAULT; + + return err; +} + int do_sock_getsockopt(struct socket *sock, bool compat, int level, int optname, sockptr_t optval, sockptr_t optlen) { @@ -2366,15 +2405,18 @@ 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 do_sock_getsockopt_iter(sock, ops, level, optname, + optval, optlen); + } 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 Wed Apr 1 20:44:25 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 940393D3302; Wed, 1 Apr 2026 15:45:09 +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=1775058310; cv=none; b=eMTNm+7rpNVzfI5IYSESBtyNpqJhEwxYRh/yyavke6g7XqlKmcC4rbvDpA2a5qEy9ay4JV0r9a3a2Kqn5OqutwcgKX0HR/Qa5PPsGWcaDWmPXmZT2rBwbpz1GLvFfXLA3f/N22XIzHIQYfLZwISpq1EcHuc3LD0traM19l8L1r0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775058310; c=relaxed/simple; bh=X/AoYJqdE+MtYH0JlUBWh2qPaaEB6+cAWV8EcTSYaeQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=smazrPKLy9I7QDBXvH+W23Bzik4Omt0zBmQRBs123lNOhkDu61QN2Mxpw7sRwBCto9c2hGgIoVQ2bQ/Rlxp+3xMR/FBY7xAIyHrCH4VIMyuDQCIJ9dZRGVp4QeWkvDqgrpIKeB+G92r4el5zM8F2KyhQQTctnDlUshmn2rzzbq0= 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=DYtHK2oX; 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="DYtHK2oX" 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=P59MOqsT5WVRRPdQNx+zFHzBHzuH6NeFfyok3UXQEyM=; b=DYtHK2oXweuFw5ku0FkahLT29j eXzuZa8En7la/tJ5MnJkobcBdRFFbst4eg32FA8Ikq+cCezEi1yJX4cfvv6LCk1ANvqOhiDIzpjK+ CUFOyxomQrEIySpVc6o+70LPVrigz5FwC9fXJ9VArjdsSJEYKgnibMaBmJzQFZapnh2ShLNd4JJFG +Mr2z0aUTl6v1PJ+Bcux42gZgVbZOLAXk2Ftp6waVWZ181PLNc15cIzLb2LkxuNqUPlkc/ovVe8VS zOVcp9nhrSq3y7QVPMZLqPbUnBPRV7MiT4iXE1bcpecnC1c1M/C4IM3c8raLQEjtIDeroXe+8I4td cDjz2tvQ==; 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 1w7xkf-0035cd-2A; Wed, 01 Apr 2026 15:45:04 +0000 From: Breno Leitao Date: Wed, 01 Apr 2026 08:44:28 -0700 Subject: [PATCH net-next v2 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: <20260401-getsockopt-v2-3-611df6771aff@debian.org> References: <20260401-getsockopt-v2-0-611df6771aff@debian.org> In-Reply-To: <20260401-getsockopt-v2-0-611df6771aff@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=2766; i=leitao@debian.org; h=from:subject:message-id; bh=X/AoYJqdE+MtYH0JlUBWh2qPaaEB6+cAWV8EcTSYaeQ=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpzT1tMJaqtl0UeFruHzpKtaTppA+65BLRhFbsq zqkPYiLzgOJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCac09bQAKCRA1o5Of/Hh3 bV+UD/0S/gVC0JUVzIsyE5TdV2qheg+HnQF5EknwrMGroj4e3NQcxmPptGmU5F/7MbQXAZ1EF6b a+RIv7eB/9ZQpq4cEFOMaEto6EQQs2lnhhJAo6NM4hTIVAVJpdAF4xTBFV87yrqwt0pMWRa+dF6 i4c+ABe/0D8GwaRadjOOtjQsxJ8gn+HuUpMSJga7iHr4ypj/5XQwuMNX3CQ4kE9lBEGYFsKitk8 5aO43h1/TpnAl9Y3UmGDtJvIzJF323Jl9LlQlGf0wQlQSYYfJiYD9Io/UGpH1WOe0feBXJUItZ6 0CoWvXuQGKJ/7rK/YEI9OiFEBNHTnIXMXjXD9495bKZpAQ6/DtO2UqIZOBP9KKbwYY5y3KfR0ed KILpo6l7v5ZqIvsM5d8vLoUB2a5gCXtkhCa48Tr3uur1oaATtWnHGlzeCwk6xriKs/PDjpmv8BR Vg8PQtujigwNVZ+IQBHYSvxT5fxPHPcquxnmQjYXGUfX0lejdp10MbUUmZUcyG8ZIfAGdnDL1E3 4pJmdahkNtcql4BQKZ3v6rHr62JH31Okc7de00TvFfGpeItMfYwpHFd25+67OSz80cuHw0Ab+0a yfTUXPgJBLoHvvefQa7eqVwlkOhwmSNgVWkUfBsFDWmzEvHvkvpvcyC+U60V9qyNA2p4Fn+rZO5 lH5CRkLd2jjsauA== 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: flip data_source to ITER_SOURCE, copy_from_iter(), iov_iter_revert(), then restore ITER_DEST before the common copy_to_iter() epilogue Signed-off-by: Breno Leitao --- net/packet/af_packet.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index bb2d88205e5a..531bcee02899 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,8 +4115,11 @@ static int packet_getsockopt(struct socket *sock, in= t level, int optname, len =3D sizeof(int); if (len < sizeof(int)) return -EINVAL; - if (copy_from_user(&val, optval, len)) + opt->iter.data_source =3D ITER_SOURCE; + if (copy_from_iter(&val, len, &opt->iter) !=3D len) return -EFAULT; + iov_iter_revert(&opt->iter, len); + opt->iter.data_source =3D ITER_DEST; switch (val) { case TPACKET_V1: val =3D sizeof(struct tpacket_hdr); @@ -4171,9 +4174,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) !=3D len) return -EFAULT; return 0; } @@ -4672,7 +4674,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 Wed Apr 1 20:44:25 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 9F93446AF0A; Wed, 1 Apr 2026 15:45:13 +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=1775058315; cv=none; b=ptRMvcYdcjMfcdDwZLoQ5Vsz5x0Fhnq10AzJcfa8Mc8Wt4Ih9uUdiCl95sgNmFVStQtkebvdD9NJGb8hZPs/IpxSMMk3f+wyM2KmvUYAf7NRTlUIeodkuaJBK4+Y31qblOOjRt6Zb44HDa5pg+HTbGovBOnnBWRSlb+qUz0R07s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775058315; c=relaxed/simple; bh=iqc+thnplGbagtZitkFr0/8EaF2514ngtda7G4+ycEg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rGL80+fIv39QcAthXvgSMom+1gZrvLc1enMLKOHBWORoVtfGrCOrP8kpN7bFWX3AlRSih/NpWm+JZIBNA8gpwlo73n6oLuOvDuhobnK+qJSj35preM1oNYYUpleOWo/gqr3nJPEcPQSNo1zSuWGkpEoCG3DvfCpNpEBru1+++5M= 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=tlLU2FZM; 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="tlLU2FZM" 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=Lej6QSoacgl2a+nP1MnseSSrOlZxwpQzZtAY5CDn1Yw=; b=tlLU2FZM0rY4qtZfObiirS4xyF P0YltTpMm6u0SnucTi4WO2hzR3hsjqzU9Lp6kax2XVHC57s2CxN9P+eVCoYDtIHv0fHa4/UEol/LZ SA89q6jWwLAH/Ez9pAUuIyEo6QVvbT4FefpGbcHsYYot2eJw9SwXr8IvPXQpymoSbCm8KGNCAb0vh WTTRpA9pNgaV5Msv+Ht+1o40Ux5qVPWiCdTBy8E9RTWgeN9b+ZkWz9JmXTuKcNAv1Xd0CzXIDnGBI b1nnV98xnouIW9fvH352AtADF8/mn45jKKbX7ewxGyq83fnkoWWyIOymRXjkEOy+81EeXopeeCwR3 gbkcF95w==; 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 1w7xkk-0035dd-10; Wed, 01 Apr 2026 15:45:09 +0000 From: Breno Leitao Date: Wed, 01 Apr 2026 08:44:29 -0700 Subject: [PATCH net-next v2 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: <20260401-getsockopt-v2-4-611df6771aff@debian.org> References: <20260401-getsockopt-v2-0-611df6771aff@debian.org> In-Reply-To: <20260401-getsockopt-v2-0-611df6771aff@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=3556; i=leitao@debian.org; h=from:subject:message-id; bh=iqc+thnplGbagtZitkFr0/8EaF2514ngtda7G4+ycEg=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBpzT1tMfMi/RtUGVLqCkkhguSfwnWWgUf5hrWp4 6SH1L6hjZeJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCac09bQAKCRA1o5Of/Hh3 bV/5D/9CGo1OaKmU7rR0S+c31BjEmkfEgNjBU5bEXpz89FVM5PHsQUPObRb+lkf/ijBJkyqnZEx 4FkVn+y+/xw1ppO8lETRTaQAQ3FBEQlh0SHsalCXOGz7ehL3S9/XBNAMoS96QB3m+D2XrfCyBrZ rXs6J72WKKIV3bUfiDcsNVZ49Q6OyTnruWABm62W8wHz07bHRPbcbagb2+aiyHXrJwKMAOok87R QG+Ed6Y7P1Xv18FmT9kaPVuxaZ/wmECqLt6AmPjc2/O3q5Cd2gVGcsMIKYYNC5CQYk1rNw/fZzG HSYYmuO43Gn/IUP835kahXJc2QBxyGMi8+WMVBibX9O4aXAqwGN9IIfC8+mdPUIOuzdED0/0CKZ YhEc749hxXiMQOUukqW8SeBp3CGtnDaZjtUvF1k//8igxfLy1DYqqQqA7uCinLQQOcsVFJ0EQLn bXYnL5IL/xwIzFHfttlE4LTyEoaw5APTlh2Wj4CMG0UkYThS2KnwD0YFUEFd0bcsLZRBX7hmxl9 Tt3i3NlhyIeZ3nrx2Lyukojhx+uQ2Guq+wITfK2SbivUYh7Nwpf6pf3Kb9R2Vr9WfOieHt+NaZ6 9ei8JZuguasjg6Qn+AXdvoY7CtZ3ZKesTqlhjIvDI6Tm73Zqt5OIjH1W/Hi3ZQJZ5Hrp4PkvWkk 70CuwSDZIsRL0+w== 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 --- 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 eee244ffc31e..4b3408528637 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) !=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) !=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) !=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