From nobody Sat Jun 13 02:56:56 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 92E573D47DC; Mon, 11 May 2026 10:42:02 +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=1778496124; cv=none; b=O7krW7J13sCXm7hd3YnZtSVZwamfjKtymvlooZFrle8SlqmOtw/YuYGgvTmpjq/wJfnxTiV3izQTkX9Af/qwsO4H3RuPI/9D6nw5LiWBA5Fl15Kkyvhbfjv63pPqNxacT3JyTTD9dErgh02rDUKp1BcRcz3E0c/BLffOGUOaY7s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496124; c=relaxed/simple; bh=h6zSdtN9jQgMR/YPfbG1OygHwk4VDPpboHdb0JfjOWE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aYoCdXQQoQGn1K7RNDc5Bphm3OnIKGPYMWapYATdp3U3h1cUmhroE6dKf/I2ptAQxXaWGU3GpV8Dj/ORg4HsK35OV2UrkziGO06Cq48RXaO7tgK580iLgLxRyRN2rdyveS7vfO5zKrgg2fFHqlz73TftRyWoWtZD6j2SXCDzBx0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=ebgfSf75; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="ebgfSf75" 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=1XedRuOdFDTkq6Iy8V1E9JuuU/kZM1EoPconoc3Ujuk=; b=ebgfSf75t+3LGt5JtkJLFQygEr L5wj4gWS37lANmsYO0OChJ5WiVfKQ3/yCdTb5uUPX2/bym7Den7I8SxdNVyGB/jDxdyPLX59q9V9j wrcCS47RI5S8s4CTL9zFfJnP6OhVJbU06lENAvFXBjrZygq5LcpqsC2mZXz08XdItN+rEkTlWw3N2 6yeqK7isue4IqWXAcdCqTbnZgyyPEQ2JcwN0SXTiuiypjmzrJofjEkhzSAFP9PUOUdfz/sPgVjbV0 P5Qc/hvOTNTqKZTS712+0QwlDjg3vY99Baq+DvR3NB27W1HSCUV4KA+IW/xxgQ11PZSfHulb93b7o MQBSRxUg==; 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 1wMO5I-001XeG-1S; Mon, 11 May 2026 10:42:00 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:46 -0700 Subject: [PATCH net-next 1/7] Bluetooth: hci_sock: write the full optval for getsockopt 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: <20260511-getsock_three-v1-1-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=1628; i=leitao@debian.org; h=from:subject:message-id; bh=h6zSdtN9jQgMR/YPfbG1OygHwk4VDPpboHdb0JfjOWE=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvxpCu685LY0M+x+JGeNiNeOAEmTcLxOpM6 sUTKNcfLriJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bdBED/9BQMslx5J3oS7A5NvTjE6ZYWguJWBxVtl5eXMXQgx+pnQxR54Z+7FLncjY5zaHdOnITnS m1dP4wc3jmkIhRPkqkgX2DCpZIgi6TYXarTJX1kh9gaRyy51HHLWnzECgR0iYtPJsPJTE8Cvc9c VFaic+w1TS0CSWzrCIUEr6avlOVs6/w2Aoqj5BhJLorhCZEC+JDfWaM8QIqDLwegqOJXGVKxctk Pbxsb0Td7VPbZBwsWZKwEbeuChZ2hDyxaPRyZSgl7HG2EHihq04JFzi/tDqMGht2lTX9+Rbmvjy 3+SZLwUZwi02gzVmLb3JHXVEiZacpRGYpQkg79UpvPL8E2EPHCzco/JUtZUraL8USYZGZqU7upN WSIoc2Bpr30+8Vp/ZOw2+PHS1g1nu2YI0DeQgQo5fwuZ2nb6ydQ+XD6VF1uFXf7HEeFIIfUrOXf v3EndpdHewsw8+krLTJUydrQ2qwU2WBNF8G0HbsPvgUgQ4SSl73AhL7OWRk8rd4qzhvurCMNsEQ ZCCymxitGayugT4iMWah9JSFJTSa3BWkh778goeheFDHuBoDz9VQVKlEI4pyoZlwMi6OrTAFCJo v8amTK0SDOoVhFufhpCDDu+sn6zCx4pt6sQ18gJAda+OaW+aG60MD2p/eaUuZ5C4C8/9mevhmu4 kF79nw+2DD5zFDQ== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao In hci_sock_getsockopt_old(), HCI_DATA_DIR and HCI_TIME_STAMP both store their value into a local int and then call put_user(opt, optval). Because optval is the function parameter typed char __user *, put_user sizes the write from sizeof(*optval), so only the low byte of the int is copied to userspace. The matching setsockopt path reads sizeof(int) via copy_safe_from_sockptr, so userspace passes a 4-byte buffer in both directions but previously got back only one initialized byte on the read side. Not sending this through 'net' tree given this bug is mostly invisble, given opt is 0/1, and the last byte is being properly copied. With this change, the upcoming translation to .getsockopt_iter becomes mechanical. FWIW: This behavior appeared in commit 1da177e4c3f4 ("Linux-2.6.12-rc2"). Signed-off-by: Breno Leitao --- net/bluetooth/hci_sock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 0290dea081f62..1823c06ba8940 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -2088,7 +2088,7 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, else opt =3D 0; =20 - if (put_user(opt, optval)) + if (put_user(opt, (int __user *)optval)) err =3D -EFAULT; break; =20 @@ -2098,7 +2098,7 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, else opt =3D 0; =20 - if (put_user(opt, optval)) + if (put_user(opt, (int __user *)optval)) err =3D -EFAULT; break; =20 --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 9ED083D9034; Mon, 11 May 2026 10:42:06 +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=1778496130; cv=none; b=OfpmsQcUXvSd1CJFUV2hqcYd3wASi/kuZTL7T/WS6559IS5fQoqFABDSxu8Z+wmJofZfPg8Vd1OhmHWLGDaWDFhDezAyPBNHiMolTNBIjzFLkLIg0gj0yANPNyCQvtxzlrxr3mj/KnEFMLVQ3QPmNQwmHKcmMfffoZfHBGi+BSA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496130; c=relaxed/simple; bh=HK+Sfftx5xMXf/ohhSVSyX4kM0dUiUEr9WG/OrDiAs0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KhUNQfi3wN09Unc/js+osizJJg4j/V68v1C0N7kQJN5/TQQ0x4z9wYYLq19gSwMIQobckjqWYbtXLZ4OIiyyIkDFmzbyRyATYf4hFTiL0V7pbXN8yBDK3XZoRTlvQe46BNyiLcpStf5lH23KqI/BjKc/3rPMK4ErDVTLgL9X5x8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=g/wkbaBd; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="g/wkbaBd" 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=sNHiQxq5X7Gs6FyItbbqpwShrdRtmwW2a3t0q+1JSZQ=; b=g/wkbaBdFOHm91JvefHdoy5ud9 p5v8TZzN/DMCukdNZjsIeFsieIXB4eOXXy6kDX0kdVhEL2EcQ3T1Qol95YXc6CJzQsMQ7uTnkEZq0 EzxxwYbmIhWZVvMM927MO9r4HX9Hke4Afuf/DEcUL0KrnH/72NDyIaZEfTkUM/ROvmo58MT8FR+Lo lJ8NEgjOZ45n4K6o1BDaZ32OubvAgovuGc2hbXPz7e3OlYOZj73CLdwLLRY8pUSh4V883IG1AZJG4 J0LN0leWktw2BNXEJZBNHob51rmqbrYrPC1OeEOGMI0FlLypZpH3mxxrCRAl9uo43NjmWVYLFJ08f ARlp4UpQ==; 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 1wMO5M-001XeM-2t; Mon, 11 May 2026 10:42:05 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:47 -0700 Subject: [PATCH net-next 2/7] Bluetooth: hci_sock: 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: <20260511-getsock_three-v1-2-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=3818; i=leitao@debian.org; h=from:subject:message-id; bh=HK+Sfftx5xMXf/ohhSVSyX4kM0dUiUEr9WG/OrDiAs0=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvSaQLGnX5LVHbMVVMrHqrPGGOy4+JXxlNm 9lf7mz4Dg6JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bQMSEACJ/0kZ/zh2Mj8zhtifHJfEz4aXrzSk0KNnqGYxzRDZtBGJpwWa8wyhM1mbWbuD7g979Er yVT1VPfSqbwPbQ53C8waCFx2sbz2fLUWsXXB0pF5UkE3NKQRdK0EUJ1NXCaBSNotrY/TwiJrtAp x3XgV2wrM1J0FpceKPDgp16hLkUBmhk4KS0axotlNHyJNqSvmePuFrJ4idjLXL1KvaViSu36sLn nIXu1AWa6pr4U6BAuTlyGe6KJ3qSeAGv6lKihzbEOKp22DDznSb47nY4T8LOSeWyfAuzkUu/utn nJ67arySqaLVU4bv17klFQ80leCpQogwQ7BjfdD0s0egQf/5nRajb9/B7dT6+8kplrTSJUKS66J keRyi5euAAtthi+zaYLduDChYDiIBDeH1Ji52xHGfEXedGr6ko3YY9E+13y3+VmSX6pmlQ/88pW Bb7qlJdzSLmHnm9OiGzHIMxLI95DtUkWnaDV4gesn9hrA5bpXkF1WQaAoQjDtydCqg5jZjPDt8U Bzd2OAZDIiZG8wLSMXTQMtqUMYmRq8eo7Mq5mD2YSL44hrnQY5866sARG8rVUqiEtdciKcGxG4/ da1s7HNNPT//5FmladNN6ifGJvSQzAc/4Abthq/MOpBZHkGV/UUoIWsaA+0lN8mT25pfy9BPeGn o9E8wJYiSaOdSQQ== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert HCI 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 *sopt - Use sopt->optlen for buffer length (input) - Use copy_to_iter() instead of put_user()/copy_to_user() - Add linux/uio.h for copy_to_iter() The sockopt_t parameter is named sopt rather than opt to avoid collision with the existing local int opt used by HCI_DATA_DIR and HCI_TIME_STAMP. Signed-off-by: Breno Leitao --- net/bluetooth/hci_sock.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 1823c06ba8940..61fec674a2078 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c @@ -27,6 +27,7 @@ #include #include #include +#include #include =20 #include @@ -2063,7 +2064,7 @@ static int hci_sock_setsockopt(struct socket *sock, i= nt level, int optname, } =20 static int hci_sock_getsockopt_old(struct socket *sock, int level, int opt= name, - char __user *optval, int __user *optlen) + sockopt_t *sopt) { struct hci_ufilter uf; struct sock *sk =3D sock->sk; @@ -2071,8 +2072,7 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, =20 BT_DBG("sk %p, opt %d", sk, optname); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D sopt->optlen; =20 lock_sock(sk); =20 @@ -2088,7 +2088,8 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, else opt =3D 0; =20 - if (put_user(opt, (int __user *)optval)) + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; break; =20 @@ -2098,7 +2099,8 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, else opt =3D 0; =20 - if (put_user(opt, (int __user *)optval)) + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; break; =20 @@ -2114,7 +2116,7 @@ static int hci_sock_getsockopt_old(struct socket *soc= k, int level, int optname, } =20 len =3D min_t(unsigned int, len, sizeof(uf)); - if (copy_to_user(optval, &uf, len)) + if (copy_to_iter(&uf, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; break; =20 @@ -2129,16 +2131,16 @@ static int hci_sock_getsockopt_old(struct socket *s= ock, int level, int optname, } =20 static int hci_sock_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *sopt) { struct sock *sk =3D sock->sk; int err =3D 0; + u16 mtu; =20 BT_DBG("sk %p, opt %d", sk, optname); =20 if (level =3D=3D SOL_HCI) - return hci_sock_getsockopt_old(sock, level, optname, optval, - optlen); + return hci_sock_getsockopt_old(sock, level, optname, sopt); =20 if (level !=3D SOL_BLUETOOTH) return -ENOPROTOOPT; @@ -2148,7 +2150,9 @@ static int hci_sock_getsockopt(struct socket *sock, i= nt level, int optname, switch (optname) { case BT_SNDMTU: case BT_RCVMTU: - if (put_user(hci_pi(sk)->mtu, (u16 __user *)optval)) + mtu =3D hci_pi(sk)->mtu; + if (copy_to_iter(&mtu, sizeof(mtu), &sopt->iter_out) !=3D + sizeof(mtu)) err =3D -EFAULT; break; =20 @@ -2185,7 +2189,7 @@ static const struct proto_ops hci_sock_ops =3D { .listen =3D sock_no_listen, .shutdown =3D sock_no_shutdown, .setsockopt =3D hci_sock_setsockopt, - .getsockopt =3D hci_sock_getsockopt, + .getsockopt_iter =3D hci_sock_getsockopt, .connect =3D sock_no_connect, .socketpair =3D sock_no_socketpair, .accept =3D sock_no_accept, --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 6A3013DA5B7; Mon, 11 May 2026 10:42:11 +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=1778496136; cv=none; b=AcCGvbC7i1QitXbKRwrpTAZT0dpzKkMSTfZeIyN0c9DRcsyEUJ+8hutkBpTxQzFVkcaPB1mLvoKXQHl/PdCPg3iS5C1c3Kqzyx9XeK9HjnL5C1e+/4/cDFDFfWnetWYM4hNtOdaRDSljLeM7g6NXMchlEM6ITf5YiF0yv+6VHQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496136; c=relaxed/simple; bh=zv4ypYBlXlacgkjArTcJ+qxpcgQPje6jIqRBAe1SKOc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=fbFQT97JhviTPZ3Y1Q6guuCHux/WIsyEmncWK6rdphR9d04xsTrgZPmDhkBUgawYhF4DQuHsqqb3gidZU0P6KRn0jSQlOgyEz+XO1GKBQKn61BxIsE23pidoKI+7AOczqzLgYQ+Mg8sz6OiWUyhvkP84+BX5gY9Y6RmNiMOMz8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=rNTIWMCs; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="rNTIWMCs" 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=tnpW3RxsYB3WXMtCFMcp7qbYXymVb+70PXZPn7pH3Mw=; b=rNTIWMCsG58ZzX7cW61TdXFq30 6CJzbMFAVpJzhSJLw0zYnrygVbF2D00CNSzaIcQhO2Ycw8o1KBQcbjgBvIurdLyXDD4myepbPpcSc +55yRqnrpxCZ7GpYLiSddLEntUJbMKFzYuYdMKV73kX+58qPE93oAdPcUBloNld1Ai6S2Wfhj7+k1 X4qGcuffAFgK56GEP4K5btIASycRB0iWq0sVOQxLf5GL8bcwahRf8zOohcwZkTrynf3vZ4DkleZ94 KbPlQWGt3YgehFRRAiolGgoTraGzdvRMEnUS7Wss4/tgFRxPvzxA+QcnlDdLTQDTq6IYSivYTiHIg ZWqX6bWA==; 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 1wMO5R-001XeW-1l; Mon, 11 May 2026 10:42:09 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:48 -0700 Subject: [PATCH net-next 3/7] Bluetooth: ISO: 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: <20260511-getsock_three-v1-3-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=3136; i=leitao@debian.org; h=from:subject:message-id; bh=zv4ypYBlXlacgkjArTcJ+qxpcgQPje6jIqRBAe1SKOc=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvQ7E/qMrjv7D1RzYYNoh5mzYwQp2DvSYYn FWLw0EKwEOJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bSdQD/0erTKwmPjA6j6Hk5H5UNXppSVtNRx4kaSOmMK9jUQVl9S+jqmAjVG/s0wqatiNbt91wPg rEsIjeamCmvAHjTcq0aFi4A/PI3bn+Y/rDXFpG+RhyI1Pd4M/or3tOnxY3HXFY1TMYAlRXYgYH8 gIpWk3X6q05IcVSd4YPPLYbxgrJHCi21Ha/b59kNc6QXxbmtS/gT3cb1PqQE5JrPOpNY1scwbR8 gaLs5H9xdf7yrfAIJs72WJgXTHe0qxhZadIqVg2KsT/34/UxEsOZqAayHmhosljvKrWoyYTPAEE stCB5W4CnK8dSPtNOUZZgztJLDMAJx5KvC7ngjChABrnqvyGDKiIj17V2m3IQbRiTQiRxOCyFna myK0x/fwYW4v+YWihbIR7tESUxUOZakX90T0IQxYLrNeXOPD0yuUhSvR9zql/UPdKvlassaUFG/ ArcoPYJfwG7FtuEEEcpKt6zIvn+bqMULGvcU/SEZ0YF/c7TNYC18mdfTyqIbK/QLpxYCzk4jxB/ xx1qk7J3jiu61dz52zQyThXkRkVwAXBCWLxTVzpF+YUoskv8hW7AoNqU43TUoVfaW6Obuuf4C+l 3FIVXPqkBsdWRbCfD/gkLFg8MnbPgIm4G3aMXrtQWZAdomiZKmIl3RaGxXW082JqhiGN/Z8R1gK Y6NfkonzNAaxnqg== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert ISO 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() - Add linux/uio.h for copy_to_iter() Signed-off-by: Breno Leitao --- net/bluetooth/iso.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c index 7cb2864fe8724..0d792d36bb5ac 100644 --- a/net/bluetooth/iso.c +++ b/net/bluetooth/iso.c @@ -10,6 +10,7 @@ #include #include #include +#include =20 #include #include @@ -1842,18 +1843,17 @@ static int iso_sock_setsockopt(struct socket *sock,= int level, int optname, } =20 static int iso_sock_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk =3D sock->sk; - int len, err =3D 0; struct bt_iso_qos *qos; + int len, val, err =3D 0; u8 base_len; u8 *base; =20 BT_DBG("sk %p", sk); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D opt->optlen; =20 lock_sock(sk); =20 @@ -1864,15 +1864,17 @@ static int iso_sock_getsockopt(struct socket *sock,= int level, int optname, break; } =20 - if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), - (u32 __user *)optval)) + val =3D test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); + if (copy_to_iter(&val, sizeof(val), &opt->iter_out) !=3D + sizeof(val)) err =3D -EFAULT; =20 break; =20 case BT_PKT_STATUS: - if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), - (int __user *)optval)) + val =3D test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); + if (copy_to_iter(&val, sizeof(val), &opt->iter_out) !=3D + sizeof(val)) err =3D -EFAULT; break; =20 @@ -1880,7 +1882,7 @@ static int iso_sock_getsockopt(struct socket *sock, i= nt level, int optname, qos =3D iso_sock_get_qos(sk); =20 len =3D min_t(unsigned int, len, sizeof(*qos)); - if (copy_to_user(optval, qos, len)) + if (copy_to_iter(qos, len, &opt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -1896,9 +1898,8 @@ static int iso_sock_getsockopt(struct socket *sock, i= nt level, int optname, } =20 len =3D min_t(unsigned int, len, base_len); - if (copy_to_user(optval, base, len)) - err =3D -EFAULT; - if (put_user(len, optlen)) + opt->optlen =3D len; + if (copy_to_iter(base, len, &opt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -2660,7 +2661,7 @@ static const struct proto_ops iso_sock_ops =3D { .socketpair =3D sock_no_socketpair, .shutdown =3D iso_sock_shutdown, .setsockopt =3D iso_sock_setsockopt, - .getsockopt =3D iso_sock_getsockopt + .getsockopt_iter =3D iso_sock_getsockopt }; =20 static const struct net_proto_family iso_sock_family_ops =3D { --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 9CAE23D9026; Mon, 11 May 2026 10:42:15 +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=1778496137; cv=none; b=Wf1CIV+zHf3f4NZdjYXQ0VesDIP3skB4lLqXlAn+JEnIdUAc4PYsXwTxuTv4oSAxoVloWy0gK+SnD6viTRj2M+wALC8Pnr5xuFVS8P6oanTzLVxLbEr4cMIcsrSYPi7Tbde2kc3JFfMcUcdka37yZuVWhs1B/d+VwPFUTvj68Vw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496137; c=relaxed/simple; bh=gB0St4CQxpXU7gKF9rXtafb1OmVyY/D/UPam9e+oqso=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pXCR4DaJPXbcpDVYPiFs5vdX4NqleKiSTomfA0dOxL7VU6FbP+kkIXa9II74lTk/IdjVqBN4UInTy5wbA+KxTHqYdTFJGot0YpdD1P2rrc1UMpyWPRnrc/H/OyXtxu/tZI2NIRX874H051i4YuEF4+4p+ZN7fgFY621/OiX9Pec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=Afyk9n3y; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="Afyk9n3y" 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=JpTg0E3qD/O8DeTaZUSnQmT3HKvGWqiv+8u7BGQ9VJ0=; b=Afyk9n3yDjsUKtGOOSiBu+JG4P oqkXOHELRk1xIiE9skzzXTskyS/VbLzJKaCHpivIIC0h3dRDDCii07X7wfpkIu5OU5ud6wR3lAUTu Z6xB9LhQ0lak2t6ABXW1TriJO1AV1FqoppDqTXNOQ3d6mhz/x6iXeTQ/q2ruI5igVgg2K8Sr7yJOt psBMAoYRJl3t/tnmQPpnGi+A1xJwFIVnPlF5u8ftFYOHozunLTwPuZSvJQnCG4Jrb88VN6oPsgql9 xijVGQd8FOemwKuQsqBsm9xOixcYizQDhJysn7wxkmyOpodL1e2+jAbLN/QNb0pdiIxSdgGpHkuvw jvvawcqg==; 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 1wMO5V-001Xeo-2Z; Mon, 11 May 2026 10:42:14 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:49 -0700 Subject: [PATCH net-next 4/7] Bluetooth: RFCOMM: 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: <20260511-getsock_three-v1-4-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=4232; i=leitao@debian.org; h=from:subject:message-id; bh=gB0St4CQxpXU7gKF9rXtafb1OmVyY/D/UPam9e+oqso=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvTF8VL3YZdMUJyT8l8qJdVzq0VBXo0AR6Z cknCl4WOFuJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bbTxD/9Ol78Y43c9IM/BxYRgHM3yTwOjBwnOTmvpvhCijK3NYpl1NnQd3CxMKSjEibUFwKhyqgI 0Pv1OGnxc41Udg0RpqXpoxKDYetGX/7TEkBE1OvB1bqxLr4qi13JwrBLsfB/Fkbg2LMnBHY04Rh K4b90L4voyLrQZpm+O0Er4f/QllppYBdRJfLdCPLFXUSK3ZhLzSeYPSWIMpwQZj152z6035Uogp EsyPHhjIv71OyKpHyGC5pYwLLzBOYgSTTUC2Jvj3AF4msCP5hpF8+IEPokfhmSBGqrrcm1QIx3d aEllRtjWuLi+UCfu6B/3FW3L31ri8A3QlKqD+z5UXST9RahNNTcc97I1i5pDuJXdxe3lYl/HgjD Os/ffB74yaMMTOzCUe1JQ7wZnj3TX1lGAb64GzL5F6hclpMK+o9uOfriUc9e7t0sXydmwbzyA8C kCUtv88zlf7iHAAE82HApIhG573zEPnQl1XkdezXIqXZ10fZj/f6ENepRH5QV/0CbNTF4XU1GZz jFGoAcMU+c98sm1gVpGYXKkS/7C8udNp4gbfykoI23/1cU0FWdF1xpu7OJFTEM1YmSf12OJvtqw Hc/qvx5V5LAmWsclZxPQ/hStJGkiryMTKlO01JlAgCY24d88C9PzOgQbeUoeLZ/vtoPxkUFahqk s7N+aiNtqbksTdw== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert RFCOMM 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 *sopt - Use sopt->optlen for buffer length (input) - Use copy_to_iter() instead of put_user()/copy_to_user() - Add linux/uio.h for copy_to_iter() The sockopt_t parameter is named sopt rather than opt to avoid collision with the existing local u32 opt used by RFCOMM_LM. Signed-off-by: Breno Leitao --- net/bluetooth/rfcomm/sock.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index be6639cd6f590..9b22e4240ed14 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -28,6 +28,7 @@ #include #include #include +#include =20 #include #include @@ -723,7 +724,8 @@ static int rfcomm_sock_setsockopt(struct socket *sock, = int level, int optname, return err; } =20 -static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, ch= ar __user *optval, int __user *optlen) +static int rfcomm_sock_getsockopt_old(struct socket *sock, int optname, + sockopt_t *sopt) { struct sock *sk =3D sock->sk; struct sock *l2cap_sk; @@ -735,8 +737,7 @@ static int rfcomm_sock_getsockopt_old(struct socket *so= ck, int optname, char __u =20 BT_DBG("sk %p", sk); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D sopt->optlen; =20 lock_sock(sk); =20 @@ -765,7 +766,8 @@ static int rfcomm_sock_getsockopt_old(struct socket *so= ck, int optname, char __u if (rfcomm_pi(sk)->role_switch) opt |=3D RFCOMM_LM_MASTER; =20 - if (put_user(opt, (u32 __user *) optval)) + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; =20 break; @@ -785,7 +787,7 @@ static int rfcomm_sock_getsockopt_old(struct socket *so= ck, int optname, char __u memcpy(cinfo.dev_class, conn->hcon->dev_class, 3); =20 len =3D min(len, sizeof(cinfo)); - if (copy_to_user(optval, (char *) &cinfo, len)) + if (copy_to_iter(&cinfo, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -799,23 +801,24 @@ static int rfcomm_sock_getsockopt_old(struct socket *= sock, int optname, char __u return err; } =20 -static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optn= ame, char __user *optval, int __user *optlen) +static int rfcomm_sock_getsockopt(struct socket *sock, int level, int optn= ame, + sockopt_t *sopt) { struct sock *sk =3D sock->sk; struct bt_security sec; int err =3D 0; size_t len; + u32 opt; =20 BT_DBG("sk %p", sk); =20 if (level =3D=3D SOL_RFCOMM) - return rfcomm_sock_getsockopt_old(sock, optname, optval, optlen); + return rfcomm_sock_getsockopt_old(sock, optname, sopt); =20 if (level !=3D SOL_BLUETOOTH) return -ENOPROTOOPT; =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D sopt->optlen; =20 lock_sock(sk); =20 @@ -830,7 +833,7 @@ static int rfcomm_sock_getsockopt(struct socket *sock, = int level, int optname, c sec.key_size =3D 0; =20 len =3D min(len, sizeof(sec)); - if (copy_to_user(optval, (char *) &sec, len)) + if (copy_to_iter(&sec, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -841,8 +844,9 @@ static int rfcomm_sock_getsockopt(struct socket *sock, = int level, int optname, c break; } =20 - if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), - (u32 __user *) optval)) + opt =3D test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; =20 break; @@ -1014,7 +1018,7 @@ static const struct proto_ops rfcomm_sock_ops =3D { .recvmsg =3D rfcomm_sock_recvmsg, .shutdown =3D rfcomm_sock_shutdown, .setsockopt =3D rfcomm_sock_setsockopt, - .getsockopt =3D rfcomm_sock_getsockopt, + .getsockopt_iter =3D rfcomm_sock_getsockopt, .ioctl =3D rfcomm_sock_ioctl, .gettstamp =3D sock_gettstamp, .poll =3D bt_sock_poll, --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 5095A3DA7E1; Mon, 11 May 2026 10:42:20 +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=1778496141; cv=none; b=bhc29KR72ebdcssAxYArtoPDj50fSgd2p0pXhPDJ4z1dU4tQpAzPD1eN2bdnBOHR4mPgmiXVJ2/ejABFeXXro1Exg53EZNYzbh0b4Udkk+mQSOxrLTwCIjjd5OBo1YF4zozpKKo6buy975Ym6rjuS56CXWHq+LsJE6JxHCSDdFY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496141; c=relaxed/simple; bh=RXdB+OMQFTCr5HzIoLQwuXJ2Je8Y6jzyknXHxP/EeU0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OmW1ea5x10d8xDEvDR4k/PGiB0iAL94s5UIvStKxh4CWtVpH0/XMIn2/I241jTq9OgNAbS170fLIjLeY6ho69xpV/wE45AiQkrSoXMbnlQK+O3LhGd7I7t0WyZba70UiHyoEqmhrHeldBfMNoi9NdVLz6zUrm/DC1nbZQamK9fs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=KGbNomyD; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="KGbNomyD" 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=PChf6X3S5FarPKzj6gSzmKmcK2boYjPK7wX3EmPoPfk=; b=KGbNomyDofxT5by6oMOWTOch/4 7GGypw/deFIEdYGb6H6xfWkw66LvTur5vfoiN7GIugv1ZMKcCJHYDspXmxbuPA6aKAD/RDiKV6tcE SJk9uPBv7cBy4G0IaLkOn9NnG0TWbBAARFNdO2L7dWEhf1tgpRwEzJHGfjP/qmVjqx/VD+ZSV99iu gDgQZoSCoHRauAFwvpiSec6GhcEYwGMh7TQe9N3JBrLTnk/+oKNmcMEFfpyQXcbniT3xnCfV8mnjh a24GDzyYDRjThFt8rDgqfl+JEOTheZ5xfWyCZrju5CeMXeGtM9SsBc9zzSxbWR/7gkD+OG0RVLuzs 3tzKcdNw==; 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 1wMO5a-001XfG-19; Mon, 11 May 2026 10:42:18 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:50 -0700 Subject: [PATCH net-next 5/7] Bluetooth: L2CAP: 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: <20260511-getsock_three-v1-5-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=6748; i=leitao@debian.org; h=from:subject:message-id; bh=RXdB+OMQFTCr5HzIoLQwuXJ2Je8Y6jzyknXHxP/EeU0=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvJmMtbVOKd0Z8OTzscHxhc5xGD8vaNS86c jnCm+7b6GqJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bdxbD/4wCYhs2ZKr5RXPE3tR+1i6gr309KqrDWOZsYx/XoQDCorjxeU1HI09B+KYzyrKe1UYyqt d0xoMc/X+B3Oard88+IWvHkNCUUE0Qt0CkQh6R/AsuqLwBPb9AjpQrFRheHStgY3K2YwnjXzUix a2x6WwwWTQ0Fy7A0oQTYpLfLEEtNCpgBYViZQQdkCUpcHmv9HT90yntnMt2/lZNJOx6q13xbCwm dVN86TxeTRjlWiqFTvq/ms5nIRR3dupzd4Agt+mzMxwWjXM8GRWyr1JCJs9hEEkG2jLioapEPtv /PERtS6F0RZ4OWm9OwW55cuoN2K5AEi2yXARFjvXhcLc/ArY++x/JIwb+VQ3Ipun5g2GnZXpud/ oxCvqvA6lqL3Qr8U+4zBFXIXn7sE/mZby9cmeejEFm1leA84e8TzJJmZbl9H2dtz/QuzhSifyRH UUw7uEcfC6rtiOmN+WjK1PeaYyAaLX61rpHXbgKzmYm96rIpiTgPje0ABNr4XoOqP2CsuwtsyZF mZZsGwTtkhp8OoRDW0RMxxWf2KacsvW6m83QIR+luH2Jqpp0TNnYUFHwI2SlO59nKGXgSnNUB9J tHPZJ9GqnQxU4d1G/CXNe6k3qmFh3KOuuMvY8AhWI2vTVlc9Ewe3EE3Uw5NkjjLF684KaopkL12 D1F/ZN1BJ3CtMnA== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert L2CAP 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 *sopt - Use sopt->optlen for buffer length (input) - Use copy_to_iter() instead of put_user()/copy_to_user() - Add linux/uio.h for copy_to_iter() The sockopt_t parameter is named sopt rather than opt to avoid collision with the existing local u32 opt used by L2CAP_LM. The same naming is reused for the new u32 helper in l2cap_sock_getsockopt(), with mtu and mval helpers covering the u16 and u8 cases. Signed-off-by: Breno Leitao --- net/bluetooth/l2cap_sock.c | 61 ++++++++++++++++++++++++++++--------------= ---- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index cf590a67d3641..dede550d60319 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c @@ -31,6 +31,7 @@ #include #include #include +#include =20 #include #include @@ -433,7 +434,7 @@ static int l2cap_get_mode(struct l2cap_chan *chan) } =20 static int l2cap_sock_getsockopt_old(struct socket *sock, int optname, - char __user *optval, int __user *optlen) + sockopt_t *sopt) { struct sock *sk =3D sock->sk; struct l2cap_chan *chan =3D l2cap_pi(sk)->chan; @@ -445,8 +446,7 @@ static int l2cap_sock_getsockopt_old(struct socket *soc= k, int optname, =20 BT_DBG("sk %p", sk); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D sopt->optlen; =20 lock_sock(sk); =20 @@ -488,7 +488,7 @@ static int l2cap_sock_getsockopt_old(struct socket *soc= k, int optname, BT_DBG("mode 0x%2.2x", chan->mode); =20 len =3D min(len, sizeof(opts)); - if (copy_to_user(optval, (char *) &opts, len)) + if (copy_to_iter(&opts, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -520,7 +520,8 @@ static int l2cap_sock_getsockopt_old(struct socket *soc= k, int optname, if (test_bit(FLAG_FORCE_RELIABLE, &chan->flags)) opt |=3D L2CAP_LM_RELIABLE; =20 - if (put_user(opt, (u32 __user *) optval)) + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; =20 break; @@ -538,7 +539,7 @@ static int l2cap_sock_getsockopt_old(struct socket *soc= k, int optname, memcpy(cinfo.dev_class, chan->conn->hcon->dev_class, 3); =20 len =3D min(len, sizeof(cinfo)); - if (copy_to_user(optval, (char *) &cinfo, len)) + if (copy_to_iter(&cinfo, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -553,25 +554,26 @@ static int l2cap_sock_getsockopt_old(struct socket *s= ock, int optname, } =20 static int l2cap_sock_getsockopt(struct socket *sock, int level, int optna= me, - char __user *optval, int __user *optlen) + sockopt_t *sopt) { struct sock *sk =3D sock->sk; struct l2cap_chan *chan =3D l2cap_pi(sk)->chan; struct bt_security sec; struct bt_power pwr; - u32 phys; int len, mode, err =3D 0; + u32 opt; + u16 mtu; + u8 mval; =20 BT_DBG("sk %p", sk); =20 if (level =3D=3D SOL_L2CAP) - return l2cap_sock_getsockopt_old(sock, optname, optval, optlen); + return l2cap_sock_getsockopt_old(sock, optname, sopt); =20 if (level !=3D SOL_BLUETOOTH) return -ENOPROTOOPT; =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D sopt->optlen; =20 lock_sock(sk); =20 @@ -595,7 +597,7 @@ static int l2cap_sock_getsockopt(struct socket *sock, i= nt level, int optname, } =20 len =3D min_t(unsigned int, len, sizeof(sec)); - if (copy_to_user(optval, (char *) &sec, len)) + if (copy_to_iter(&sec, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -606,15 +608,17 @@ static int l2cap_sock_getsockopt(struct socket *sock,= int level, int optname, break; } =20 - if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), - (u32 __user *) optval)) + opt =3D test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; =20 break; =20 case BT_FLUSHABLE: - if (put_user(test_bit(FLAG_FLUSHABLE, &chan->flags), - (u32 __user *) optval)) + opt =3D test_bit(FLAG_FLUSHABLE, &chan->flags); + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; =20 break; @@ -629,13 +633,15 @@ static int l2cap_sock_getsockopt(struct socket *sock,= int level, int optname, pwr.force_active =3D test_bit(FLAG_FORCE_ACTIVE, &chan->flags); =20 len =3D min_t(unsigned int, len, sizeof(pwr)); - if (copy_to_user(optval, (char *) &pwr, len)) + if (copy_to_iter(&pwr, len, &sopt->iter_out) !=3D len) err =3D -EFAULT; =20 break; =20 case BT_CHANNEL_POLICY: - if (put_user(chan->chan_policy, (u32 __user *) optval)) + opt =3D chan->chan_policy; + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; break; =20 @@ -650,7 +656,9 @@ static int l2cap_sock_getsockopt(struct socket *sock, i= nt level, int optname, break; } =20 - if (put_user(chan->omtu, (u16 __user *) optval)) + mtu =3D chan->omtu; + if (copy_to_iter(&mtu, sizeof(mtu), &sopt->iter_out) !=3D + sizeof(mtu)) err =3D -EFAULT; break; =20 @@ -660,7 +668,9 @@ static int l2cap_sock_getsockopt(struct socket *sock, i= nt level, int optname, break; } =20 - if (put_user(chan->imtu, (u16 __user *) optval)) + mtu =3D chan->imtu; + if (copy_to_iter(&mtu, sizeof(mtu), &sopt->iter_out) !=3D + sizeof(mtu)) err =3D -EFAULT; break; =20 @@ -670,9 +680,10 @@ static int l2cap_sock_getsockopt(struct socket *sock, = int level, int optname, break; } =20 - phys =3D hci_conn_get_phy(chan->conn->hcon); + opt =3D hci_conn_get_phy(chan->conn->hcon); =20 - if (put_user(phys, (u32 __user *) optval)) + if (copy_to_iter(&opt, sizeof(opt), &sopt->iter_out) !=3D + sizeof(opt)) err =3D -EFAULT; break; =20 @@ -693,7 +704,9 @@ static int l2cap_sock_getsockopt(struct socket *sock, i= nt level, int optname, break; } =20 - if (put_user(mode, (u8 __user *) optval)) + mval =3D mode; + if (copy_to_iter(&mval, sizeof(mval), &sopt->iter_out) !=3D + sizeof(mval)) err =3D -EFAULT; break; =20 @@ -2000,7 +2013,7 @@ static const struct proto_ops l2cap_sock_ops =3D { .socketpair =3D sock_no_socketpair, .shutdown =3D l2cap_sock_shutdown, .setsockopt =3D l2cap_sock_setsockopt, - .getsockopt =3D l2cap_sock_getsockopt + .getsockopt_iter =3D l2cap_sock_getsockopt }; =20 static const struct net_proto_family l2cap_sock_family_ops =3D { --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 C915B3D9DCD; Mon, 11 May 2026 10:42:24 +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=1778496146; cv=none; b=QglypTAg7V/jC2RS7o72DB4s6XMQ1IN034BOKtn8me/9Z1gKU2vYexcKdcmS1OLXQ5SllyqH4TF6miwtsiMO8y5oSjPluEm66GnnxrGPhclyR8RbVMiSCCLEGBL1Af4sb2LyoV8V2acsgBRR/glOmu4g+zoWccQhPyprsOwg8x0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496146; c=relaxed/simple; bh=DYq6umQdMqZTUhdHO/E7X/+HRGCCc9h/fbLMCwywAhM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r3qQeDPjN5dqniG3r5o0IP9IXPeC5jZBphVDVaPLnOQjkQkeHaWHdutT/OtJ8K7jzvYQfvISbn0cUNQxgmdj9fcUYkIk0Og5Q2/EfMjSkpNZ2LX8CYszGeu5n0ijOXvjKfpabnO8LSDk30P9AsLSFFMNgZExvDeKcarJ6jcefQ4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=YgKYbm0v; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="YgKYbm0v" 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=JlQcP5h04hzIu0TVPM/h9/knvfbMgGm2wjEk1jQ7Bbs=; b=YgKYbm0vG+33y2x7VDgPI5iGJy pw/mYxZA3jhCcg30512eE0QZj5/QyF9f5SqyTDCBEb/2cMvKp/FnnDrZsv7TsLAUdme1z3SDrudcM 5h971MyiMqhXNHGmfX4MVOQmtyCIYws/4/YCNEl1SsWRsdOFPaLF/ettCJydxhiPn4MyC32FsqCqJ LkxMsC8h/N75ElJ3rpN8DKaH5Hv6iHOh9pH2FaN6kKfsx3ZErk53dzB8p40bLyYrTQZqL05bS8KWM j4Yo+yOulrBKOhULeJUGdZHc/1mPnHt4CmMiqckk0eaPC6pmP3+qOxbgACPkCRlJbXSOxw6BedIWB QRGEwE5A==; 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 1wMO5e-001XfW-2r; Mon, 11 May 2026 10:42:23 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:51 -0700 Subject: [PATCH net-next 6/7] selftests: net: getsockopt_iter: cover SCO BT_CODEC conversion 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: <20260511-getsock_three-v1-6-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=3624; i=leitao@debian.org; h=from:subject:message-id; bh=DYq6umQdMqZTUhdHO/E7X/+HRGCCc9h/fbLMCwywAhM=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvegQsqAc2+nnmwSJT84W9rZ4l0i8Bj+wn0 /wh6Na7PQKJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 beqnD/9EwDFH+x5/znqdulgo5JHr37qd6q5YfE2Xy8+qzeln1A1XEyJNhki3NUK3nkrycGoinXf UxtqCuN8XgMFioG81gRO6rhjOBHgiXFRmLfKCG734WvJ3JBryUkpDuaQDQR0FFLcN+ohwA3JJi8 xi3UWWvO+J/YptSFgad8hxji3HqIcNie743GsvCB5pxSOIn3lsnM6uzKxCWCcgizYaEwGQS6k1V wo9CtG4CIRibT3cHBCl8vJ1GIgsc/HxMTLMPqzitSz/GToJsLaG/ebFq75uJtc3TjNldrfGPbSa +fTqLgZpwRiYlRCxwlNQtrtcMvenAma99iHBxad89VOa/GDCQtLcg9Jma6f8V/UfpUcfGtg5Ur+ 6urHBGvrfvG4NcLXEKRbhOcD9vMIzZdDVGp3Co3pe//xe2WudFcxhvaDC7byXaX4rjvIwkUFx7p aVzcNPF/QQ4BqUD759uMTmPPbzMKm3gOmbS5keGlWJ8cUn4JVpTiYL8vZLfQ0l1CU0/LpZ9PEmW kbpmmp87RyYTyDcyOkz+pjlWl6KICZdV6bG6q3ZWbT/VYugtwyi8/2RdoGJyZgyKvQG1OSEUGq9 ZTBWMQ3BZpky5ypizGyGnG7vi4hmPROJGutjxs8TlYj367PTNUHTWowLzJ2ViAIOAF4n6myUrBW 64JdOMpnKkgzgHQ== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Add a single test for the SCO conversion that replaced an open-coded ptr cursor in BT_CODEC with plain copy_to_iter() calls. The test pre-fills the user buffer with a sentinel byte and: - asserts the buffer is unchanged when the kernel returns -EBADFD or -EOPNOTSUPP (the common case in CI, where there is no controller exposing HCI_OFFLOAD_CODECS_ENABLED + a get_data_path_id op), or - asserts at least one byte changed when the call succeeds (capable controller present), validating the converted copy_to_iter() write path. Signed-off-by: Breno Leitao --- tools/testing/selftests/net/getsockopt_iter.c | 65 +++++++++++++++++++++++= ++++ 1 file changed, 65 insertions(+) diff --git a/tools/testing/selftests/net/getsockopt_iter.c b/tools/testing/= selftests/net/getsockopt_iter.c index 209569354d0e3..b3cac4be4af0d 100644 --- a/tools/testing/selftests/net/getsockopt_iter.c +++ b/tools/testing/selftests/net/getsockopt_iter.c @@ -11,6 +11,13 @@ * that always reports the required buffer length back via optlen, * even when the user buffer is too small to receive any group bits. * - vsock: SO_VM_SOCKETS_BUFFER_SIZE covers the u64 path. + * - bluetooth/sco: BT_CODEC exercises the SCO conversion that + * replaced an open-coded ptr cursor with copy_to_iter() =E2=80=94 the + * test pre-fills the user buffer with a sentinel and asserts that + * the error-return paths (hit when no controller / no codec + * offload is available, the common case in CI) leave the buffer + * untouched. If a capable controller is present, the success + * path's copy_to_iter() write is validated instead. * * Author: Breno Leitao */ @@ -31,6 +38,15 @@ #define AF_VSOCK 40 #endif =20 +#ifndef AF_BLUETOOTH +#define AF_BLUETOOTH 31 +#endif + +#define BTPROTO_SCO 2 +#define SOL_BLUETOOTH 274 +#define BT_CODEC 19 +#define BT_SENTINEL 0xa5 + /* ---------- netlink ---------- */ =20 FIXTURE(netlink) @@ -297,4 +313,53 @@ TEST_F(vsock, connect_timeout_old_exact) ASSERT_EQ(sizeof(tv), optlen); } =20 +/* ---------- bluetooth ---------- */ + +/* sco: BT_CODEC. The SCO conversion replaced an open-coded ptr + * cursor in this option with plain copy_to_iter() calls. Without a + * controller exposing HCI_OFFLOAD_CODECS_ENABLED + a get_data_path_id + * op, the kernel returns -EBADFD / -EOPNOTSUPP from an early check + * and must NOT touch the user buffer. With such a controller the + * call succeeds and the buffer is filled by copy_to_iter(). + */ +TEST(bt_sco_codec) +{ + socklen_t optlen; + uint8_t buf[256]; + int fd, ret; + + fd =3D socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO); + if (fd < 0) + SKIP(return, "AF_BLUETOOTH/SCO: %s", strerror(errno)); + + memset(buf, BT_SENTINEL, sizeof(buf)); + optlen =3D sizeof(buf); + ret =3D getsockopt(fd, SOL_BLUETOOTH, BT_CODEC, buf, &optlen); + + if (ret < 0) { + size_t i, changed =3D 0; + + ASSERT_TRUE(errno =3D=3D EBADFD || errno =3D=3D EOPNOTSUPP) + TH_LOG("unexpected errno %d (%s)", errno, + strerror(errno)); + for (i =3D 0; i < sizeof(buf); i++) + if (buf[i] !=3D BT_SENTINEL) + changed++; + ASSERT_EQ(0, changed) + TH_LOG("error path modified %zu byte(s)", changed); + } else { + size_t i, changed =3D 0; + + ASSERT_GT(optlen, 0); + ASSERT_LE(optlen, sizeof(buf)); + for (i =3D 0; i < optlen; i++) + if (buf[i] !=3D BT_SENTINEL) + changed++; + ASSERT_GT(changed, 0) + TH_LOG("success path left buffer untouched"); + } + + close(fd); +} + TEST_HARNESS_MAIN --=20 2.53.0-Meta From nobody Sat Jun 13 02:56:56 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 7E5C93DD508; Mon, 11 May 2026 10:42:29 +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=1778496151; cv=none; b=RFZchxVu3AlzAuO0W5t1abEG8N3+OrZmET/3fi25a/bs2FbJIO/6h4jbRBKrEyiPJzXQ7p+u3Qbf9fmH2HkhaCiyKhGJFPSo4M9K5mb2n3v/nU+ZHvke5gaPTIoNi9QqKLoVy15hkKjcxuJhQQgVm8zU/SCfxTYCxnGc6NGrToE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778496151; c=relaxed/simple; bh=2v3FBFlG0XjBuZMc0nVvHHUoBstblBc5qcpRFYUU7T4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZreS+ETHg7CabAruqdfF0oNFUCBgyR2sPsTdv7PT2zZ7gT/navKJAZE27tKBZ1qd32/W0LBnaSG69EDl61T2oQOIa1SLsgF6YPv7rAZnvQo6p3pG6Sx5rN7W95x72Ltb4ohru3uWickMQmeJ3Zb44nr4RclJXWnKNBuqihLL+Mg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org; spf=pass smtp.mailfrom=debian.org; dkim=pass (2048-bit key) header.d=debian.org header.i=@debian.org header.b=n2TpzTCL; arc=none smtp.client-ip=82.195.75.108 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=debian.org Authentication-Results: smtp.subspace.kernel.org; spf=pass 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="n2TpzTCL" 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=QAkqmhjFVXqkWVmRDV9dUjrCOzlfdfwg7GpIXw4OrOw=; b=n2TpzTCL9WZHyUB1VoqpHIA7cR 9gWayzdYjs9j2mMrAAASbwLKzVsPBGcyLMcECrfO1Pdt0qxiGTdlcDsy2mXUE+UeU9VzpwX9xcBwV ExkYg4q9e0OpcgnB7w8aGm53hAcLXZtRRHVnhxeD/LU6+05WDQ6vENwOJoCF7YI0Y9ZvJvKPSlVq2 XYh3RIlQr1SHiZXxA2dvQDk7/Ij8bgEbgDRKcnY4swMwpDLK87ZLOGxzQG6ET2duWABbjoqtwTpu+ BHcMRUp/Fz5v7ab7aY+5vaCIQnD9u/5orN3C9a3g+2rANeoI6hSQQba3dvAx4awwDDHHxOK4u5gkK PLccj2Xw==; 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 1wMO5j-001Xfg-1S; Mon, 11 May 2026 10:42:27 +0000 From: Breno Leitao Date: Mon, 11 May 2026 03:41:52 -0700 Subject: [PATCH net-next 7/7] Bluetooth: SCO: 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: <20260511-getsock_three-v1-7-1461fa8786ab@debian.org> References: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> In-Reply-To: <20260511-getsock_three-v1-0-1461fa8786ab@debian.org> To: Marcel Holtmann , Luiz Augusto von Dentz , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Shuah Khan Cc: linux-bluetooth@vger.kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, Breno Leitao , kernel-team@meta.com X-Mailer: b4 0.16-dev-d5d98 X-Developer-Signature: v=1; a=openpgp-sha256; l=6695; i=leitao@debian.org; h=from:subject:message-id; bh=2v3FBFlG0XjBuZMc0nVvHHUoBstblBc5qcpRFYUU7T4=; b=owEBbQKS/ZANAwAIATWjk5/8eHdtAcsmYgBqAbJvhTNKsxlDIAZ9Oy0sozpCh7jvpR+nSrGxE EN+NbLU2+6JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagGybwAKCRA1o5Of/Hh3 bUUKEACCgVHYWDI1YNs83RqJUFptMRuH5b1FJ/OiODCtwePAZ7xVnnWk7okAzurHC2xj7qFErGq 0TQuGqSo7L5IcyeCacDc7CSpUZBUOAOIjKqBvZZkze9Z4176nPU2JQOZdWr8NSmXcJhCMbFatpf tyBM+D/TLXTAqDLrWm3hZmSmJH9ys4NPRanLi5W35DG+VskLXPxysn1oQOPpqeELb/LaSoBYlHX haeaYb+ObA9537aCBVMf0uQFUQH0xgyjXsIEddmQZ/zBgSIzuGaQjNtXYdTeZ/Sb5lFa/KMFszT OgeYj7mumBIi6pW0KaOJKj/V8OP+euH9Fhd7IkG/wvxdk51vkaHUoWvM1X0Fiz05N7FSNzEwOhK URAuEQ5HU30+ug8bZgN0S2YdqtbxzL8e/L0OCDsWWAJroRuFk06p8QjIdUEIo8RB0fZaz067YsF yfSKciJxiue2hURkAvcKEG4hpVR6k6Aj5wJnF3f9wEO+77cyTeT0giHytum1JtMeqkHpRQ5Toyh JDcrjB5AJT5uQW90AqG7epGwTi0BOl8OWC/i4QFoTGxca1Hd7RkxM+YZuzkjjS86qbC2EPbZmgQ wNdahqx/RcvgG5/ZMVCAzsmlgRURm1+bdzt5njkiutwaKHQ6/3HF/A5DnTbx1YTiT1T2zbOoB9J g6u1toquG/Rp78A== X-Developer-Key: i=leitao@debian.org; a=openpgp; fpr=AC8539A6E8F46702CA4A439B35A3939FFC78776D X-Debian-User: leitao Convert SCO 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() - Drop the open-coded ptr cursor in BT_CODEC; iter_out advances on every copy_to_iter() naturally - Add linux/uio.h for copy_to_iter() Signed-off-by: Breno Leitao --- net/bluetooth/sco.c | 59 ++++++++++++++++++++++++++++---------------------= ---- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index eba44525d41d9..37dcba9edfab6 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c @@ -28,6 +28,7 @@ #include #include #include +#include =20 #include #include @@ -1072,7 +1073,7 @@ static int sco_sock_setsockopt(struct socket *sock, i= nt level, int optname, } =20 static int sco_sock_getsockopt_old(struct socket *sock, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk =3D sock->sk; struct sco_options opts; @@ -1082,8 +1083,7 @@ static int sco_sock_getsockopt_old(struct socket *soc= k, int optname, =20 BT_DBG("sk %p", sk); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D opt->optlen; =20 lock_sock(sk); =20 @@ -1101,7 +1101,7 @@ static int sco_sock_getsockopt_old(struct socket *soc= k, int optname, BT_DBG("mtu %u", opts.mtu); =20 len =3D min(len, sizeof(opts)); - if (copy_to_user(optval, (char *)&opts, len)) + if (copy_to_iter(&opts, len, &opt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -1119,7 +1119,7 @@ static int sco_sock_getsockopt_old(struct socket *soc= k, int optname, memcpy(cinfo.dev_class, sco_pi(sk)->conn->hcon->dev_class, 3); =20 len =3D min(len, sizeof(cinfo)); - if (copy_to_user(optval, (char *)&cinfo, len)) + if (copy_to_iter(&cinfo, len, &opt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -1134,15 +1134,15 @@ static int sco_sock_getsockopt_old(struct socket *s= ock, int optname, } =20 static int sco_sock_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk =3D sock->sk; - int len, err =3D 0; + int len, val, err =3D 0; struct bt_voice voice; u32 phys; int buf_len; struct codec_list *c; - u8 num_codecs, i, __user *ptr; + u8 num_codecs, i; struct hci_dev *hdev; struct hci_codec_caps *caps; struct bt_codec codec; @@ -1150,10 +1150,9 @@ static int sco_sock_getsockopt(struct socket *sock, = int level, int optname, BT_DBG("sk %p", sk); =20 if (level =3D=3D SOL_SCO) - return sco_sock_getsockopt_old(sock, optname, optval, optlen); + return sco_sock_getsockopt_old(sock, optname, opt); =20 - if (get_user(len, optlen)) - return -EFAULT; + len =3D opt->optlen; =20 lock_sock(sk); =20 @@ -1165,8 +1164,9 @@ static int sco_sock_getsockopt(struct socket *sock, i= nt level, int optname, break; } =20 - if (put_user(test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags), - (u32 __user *)optval)) + val =3D test_bit(BT_SK_DEFER_SETUP, &bt_sk(sk)->flags); + if (copy_to_iter(&val, sizeof(val), &opt->iter_out) !=3D + sizeof(val)) err =3D -EFAULT; =20 break; @@ -1175,7 +1175,7 @@ static int sco_sock_getsockopt(struct socket *sock, i= nt level, int optname, voice.setting =3D sco_pi(sk)->setting; =20 len =3D min_t(unsigned int, len, sizeof(voice)); - if (copy_to_user(optval, (char *)&voice, len)) + if (copy_to_iter(&voice, len, &opt->iter_out) !=3D len) err =3D -EFAULT; =20 break; @@ -1188,13 +1188,15 @@ static int sco_sock_getsockopt(struct socket *sock,= int level, int optname, =20 phys =3D hci_conn_get_phy(sco_pi(sk)->conn->hcon); =20 - if (put_user(phys, (u32 __user *) optval)) + if (copy_to_iter(&phys, sizeof(phys), &opt->iter_out) !=3D + sizeof(phys)) err =3D -EFAULT; break; =20 case BT_PKT_STATUS: - if (put_user(test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags), - (int __user *)optval)) + val =3D test_bit(BT_SK_PKT_STATUS, &bt_sk(sk)->flags); + if (copy_to_iter(&val, sizeof(val), &opt->iter_out) !=3D + sizeof(val)) err =3D -EFAULT; break; =20 @@ -1205,7 +1207,9 @@ static int sco_sock_getsockopt(struct socket *sock, i= nt level, int optname, break; } =20 - if (put_user(sco_pi(sk)->conn->mtu, (u32 __user *)optval)) + val =3D sco_pi(sk)->conn->mtu; + if (copy_to_iter(&val, sizeof(val), &opt->iter_out) !=3D + sizeof(val)) err =3D -EFAULT; break; =20 @@ -1252,13 +1256,12 @@ static int sco_sock_getsockopt(struct socket *sock,= int level, int optname, hci_dev_put(hdev); return -ENOBUFS; } - ptr =3D optval; =20 - if (put_user(num_codecs, ptr)) { + if (copy_to_iter(&num_codecs, sizeof(num_codecs), + &opt->iter_out) !=3D sizeof(num_codecs)) { hci_dev_put(hdev); return -EFAULT; } - ptr +=3D sizeof(num_codecs); =20 /* Iterate all the codecs supported over SCO and populate * codec data @@ -1275,11 +1278,11 @@ static int sco_sock_getsockopt(struct socket *sock,= int level, int optname, if (err < 0) break; codec.num_caps =3D c->num_caps; - if (copy_to_user(ptr, &codec, sizeof(codec))) { + if (copy_to_iter(&codec, sizeof(codec), &opt->iter_out) + !=3D sizeof(codec)) { err =3D -EFAULT; break; } - ptr +=3D sizeof(codec); =20 /* find codec capabilities data length */ len =3D 0; @@ -1289,11 +1292,11 @@ static int sco_sock_getsockopt(struct socket *sock,= int level, int optname, } =20 /* copy codec capabilities data */ - if (len && copy_to_user(ptr, c->caps, len)) { + if (len && + copy_to_iter(c->caps, len, &opt->iter_out) !=3D len) { err =3D -EFAULT; break; } - ptr +=3D len; } =20 hci_dev_unlock(hdev); @@ -1301,8 +1304,8 @@ static int sco_sock_getsockopt(struct socket *sock, i= nt level, int optname, =20 lock_sock(sk); =20 - if (!err && put_user(buf_len, optlen)) - err =3D -EFAULT; + if (!err) + opt->optlen =3D buf_len; =20 break; =20 @@ -1577,7 +1580,7 @@ static const struct proto_ops sco_sock_ops =3D { .socketpair =3D sock_no_socketpair, .shutdown =3D sco_sock_shutdown, .setsockopt =3D sco_sock_setsockopt, - .getsockopt =3D sco_sock_getsockopt + .getsockopt_iter =3D sco_sock_getsockopt }; =20 static const struct net_proto_family sco_sock_family_ops =3D { --=20 2.53.0-Meta