From nobody Fri Jun 12 21:38:11 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 F321345BD67; Tue, 12 May 2026 11:12:39 +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=1778584362; cv=none; b=JMYNsYDG+pO4DXzg5oPABFfut8V3AbgGH6fI/cAlZGir1PH4I9Yi4qLbKeT6QPAjmJfsQAx5HTq2PEZevpzU9akwx+Yo/NtrZg3fIcLRwQumXJYleo1L67sd5dmQid3vbgAIf9l6BnbcTsUW3KLb1PjdrYJU0LKvbpzLqtR09gk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584362; c=relaxed/simple; bh=h6zSdtN9jQgMR/YPfbG1OygHwk4VDPpboHdb0JfjOWE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=IW3dRu1NTAaMwUO9CGAjGZKPi7xepe5DUUS+bDAkTDwt0FHsdNhoYCqwOhXfzfOPNkqeWZ9VXg3zIUbbJg+JW3lUywpNAZZiN2yUxHaQtFCcNPD+LNoKwYorHxq7Ga1H9GcJgUra0CkAZZsh01WJDa89BlYlnxOwleqCSEwt0/s= 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=h2TG5ZJ7; 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="h2TG5ZJ7" 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=h2TG5ZJ7jWZaAC6oJJ9p1q3p0J Fz1LABqaoB5+ZtxtUwJ1fy1+YIzFGhH1kJMviJYgO3mZHc/x/S24KooI8aF62Bplv6ybjKoeJ+MDV GngGawnXoj4wWG2Vz1brHNB6OD7QlqNvffPZWSnQLdXSr4mWjAAJ7k3mvwnRnnzJLnl+D92bfuyoo YrFDdzqFTOrTw55/wne07hiPTJi1jrrLVnKB0VgeAKaLcuVoLQbM03mStAM3kaUHfDJUOxd4JuGtu OEE16KpJhRXUm7cgofuYwzdC8FT5+NKDzKY/ts8k6JG2EdBak2yOHLnqCk2f8FIkQZcqNsK9KAAe6 lw7zgkUQ==; 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 1wMl2S-002Kqj-2b; Tue, 12 May 2026 11:12:37 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:16 -0700 Subject: [PATCH net-next v2 1/6] 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: <20260512-getsock_three-v2-1-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsamdWMyGriAw22QbzyOxsIWKmyJi2oEk9cd 0dl2DuZa/SJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGgAKCRA1o5Of/Hh3 bWuXD/9wV6UvdSKsEwpuvK5jLVsagbcx0Cd4a6oskdxdwaLpf7CYDNxTwJKgkj7uXkkK3GeHkAT NfTvKbvsXOSBH45RGy2JX1zjcXYRIlN2eHbKRGLVBpty280S/0hTZR/PIqdLBU68gSLo3AJmtZj 3tiagIpvk1AKaBroefmqd5qW8cfXmC5UDMgFoIOAfYdvJLjWvogdI6A+yiA+jDB0Hpb+tE/OLiq Ca/qUBa2Vpmv4tBPn140Pgv01wyrKGS+yR1CmBccWN0TBMEclHKybfyy9VEACjN57dOh3aQdXKs FZotNjTgu1zbJ6ml7dVaYH4GyzELL2/ry6QqG/cOuM340hzT6Kh0MZ+JKWac3Mhagom5sucI1ZO Y1R+8hvphu0p6UzLj1U+HL8Y9wR+QfMNzaQo0Wtc0m9JwaH9T8zTejonUSViNO5D6bXLPh11YfJ TmlK20xyU6aQ1kPe+fw3U1UQNRynm8PEr7lcDhljCPLEqXc7r09nWoj8jpuEIg8f47koxRwTBQX sdbROfjktpIV6IehkDOoL+KolGeLdbV0dHLI9c1pe6I9JrSnNcoeJcR0sd37CwKDh39uobC85d3 iGruwxaJY/5nFpUdvrnQ4lfBzzgMggLuCmKs2Cmx788LcORikaKKS6EfyUwJkpD73MeUXWBwJ5k wIioujjpEuy2FCA== 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 Fri Jun 12 21:38:11 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 94A6B48C8DE; Tue, 12 May 2026 11:12:44 +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=1778584367; cv=none; b=NttV5gcb3WYgympW5iPQj36zPZGO5ftf35RRM09K3o5GN5WINtt0lB3EwgqdeXXocZ4gSfhhB3LNLRygAkOU25fd8rdke69p1jjpvLVq3JMi7HZMWdUbvg4imKXBypBisR1h5d6Vf/qZlEu+HTM9WtKzZYsf45QGYo2OL/OpWFs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584367; 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=s+o4QepU/SdakaCdZFZb6qPOq29tBe1mC8k9t1+r+wUCM3UzrpZl6qLDF+H9RtPcDeXtLicKuJNabWcRICSTQQlL7+5tTlHed64t5ga2A7mujxJjmbSBAjRs7LVLys+HbJA7PKjjXz9F39eL0jH9VWfs9hOPv7wmpQkhx1Qdk6E= 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=B7UxfAtN; 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="B7UxfAtN" 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=B7UxfAtNONy69D8f7EEyNm6204 h7bbFNSOWZpMxyN03jbln7IBzR9b9bhRRr9l81C8+7dpAktnLN34aEPF+x25TTW8kukftW3Bhs6OF qqeDThWQJNwwZO6IqKco+i1X4r40Fza5qnJMVtgM5mCEvgumCF8E+jDNgR9i/UHnOeHtQ6hY1FWVE OnqrQ5Xg+uo7iude5+z9jPfJeEnz0HBJ856elPS/pwfnTCxic6HZNGRwLzB7Q490rg+hd2kt4Io4i iz6E+efWF0xqWP3BZWiqrrocLNdkXjCnP7yZIh53dN3AIiG4M/svqp/f+Nm6GZiw/hpC1yR71mehr kUX+O4oQ==; 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 1wMl2W-002Kqu-36; Tue, 12 May 2026 11:12:41 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:17 -0700 Subject: [PATCH net-next v2 2/6] 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: <20260512-getsock_three-v2-2-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsbGmfHz2HnWNFsHbzsK7EdpZyQCiqUwas6U N6aBnCuOECJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGwAKCRA1o5Of/Hh3 bTNPD/sHnTvtkff+PCBtG6N+tawpf4284y16XGZzDhT91hIfn/cA+ZzbCnUi6CONbtl0qs9bhj3 Vk71pcVACGrnMrFLMuXYW/VFwsx/+5+fzo/TnNpJ+GFf2nzxqw/U5ts3vYOJTHixPO2VMyZvC80 Zmj5R92fEM8KM9EgE+n6SC0HsxMJnfo5gtmuyABzr9eMe6afO4uRPE16YvpyRPL6DPVrmi6EhC5 1OC1XzUid3Rya7oMBAIh8+41kHeyk8u9JuMEy07xU/5lzNi1aLLyLf52uRi+Ty2DS9eVgIlnBH4 Fof3bByuaUEI/iLyEfBG9nM4veMvRuTI+vnz7RdtfnbyHhxB7NgAma7jU8T4gDvE7J8rx0/VdDJ mqF6gWa085P2vhupJA+ibpUhmTkFAOCDNIMEO9IU0I9lV/1bUQpJsM88qM2DksZMplnHO7BbMtd mBcemkVBA9YCCVzd0PHrdZzZGyaRgWP9Mf7Qdda8bQUOzWuLoWY/dLysRs7AmHnB/SzTLywWbWw h4bB2EDqRHNkEisewm9NmW5ICpCSzV4PDI4Al19/f7WbUY2zWTXG0dnRBNvUs23JXDdc3dKkgBD 7VmJ96fNmjItgzciJo2bbz/K0/0hiWcTW2OI6Xp89E/TlIHfK6CwaT1joLklWYvYGe7JSvck728 gZ3cV+BdihMdOQg== 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 Fri Jun 12 21:38:11 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 32F86368D4A; Tue, 12 May 2026 11:12:48 +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=1778584373; cv=none; b=Nd33NDqXaIwctRGGYidPCwIVwvSiwbEYBO4hsT8XIARVlpDoxQYCDX2InTcvccJX5wj8xrity5YKF/X1sPXdl8GzqmZ/MIvNtg5zaVn2Lt5hJCtkm8coRi60fD18tDskufYdm7sYbVSaPYevToNOrAOGyi44VatSUvKmY3hQoro= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584373; c=relaxed/simple; bh=zv4ypYBlXlacgkjArTcJ+qxpcgQPje6jIqRBAe1SKOc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=r0vQuQJZmeCAV4HHegIps5Vf7GQAHOgxMqmr4+FLn5B80gB+M9L28YjWaelkX2GDFoXrzc3A8wOTCRgOnAVsmtguRNyqBBmCWNsk7AG3jNhUFQrsHaHmIDviEMebOv53E1rmUvLHnpClmhScSp3hoYhy30ItNugRbfkmAELbK88= 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=D3oBSZTg; 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="D3oBSZTg" 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=D3oBSZTgxSgJixQ4vOx8DUjNdp vliDSqIUiuD6uZEa/T1bXmYx1cCOmY8VI44es+uOmDNhatzON4AziHWc7DGbI++4qOnRTfgRMvXZH Eok4mQKrSMMT7zt18Rb18LJf+CRNaWo7lBSeqHQbjX2JiaGTzvvaNGjoirm2U9p3SCn6EttfN3P6+ /ewJCJErfvd0iFJIcuF7dYtcCQnBhU7N3rJV0qyZL/aZFYmoqYdRaGAGf9uRFHcHMl/sniysShAWG K39zXW1N/MsmWo8aQO2zXJGWRk8ZszcO+UDTNR6Fxmk2RfSGsvjUI6Ow17Kr4SdMieRroXvXYqn7c Q5rKEzTQ==; 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 1wMl2b-002Kr4-1C; Tue, 12 May 2026 11:12:45 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:18 -0700 Subject: [PATCH net-next v2 3/6] 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: <20260512-getsock_three-v2-3-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsbP2nUfsYddSe95/5fBUcRp+0X/+LZuNMWm SmcErDaNGuJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGwAKCRA1o5Of/Hh3 bbVKD/4tSCwA2KUnjhEi/99ESk65fM8iPU2yDG4Xg0UcHWqVK4OziKL0s4XdezVkmQl+ENhqpqg ilFSCvJRBoIZEGVrdedRcnx4nOFapAWzruFRpT2s8qCDFstG293sgfYYKouhXPsZdl+WuukLd2g /diDtyUKp9Ne/TnwgcrNw6brGiuuGBF8eg9B4HiJc6IN+0KU/qNEJIHeeyGkynG+PX1cOjtMv9h yChZuY/KpNd5FFvsg7KxAPB3fCEAM8D+CnncrcHrbH0TF2OZ24RvbjzkrEY7YMpoi1gAmbxPw0u rT+hXkg9AwG/Mem8wBKV8oCtQ6IqIxpZamI7zlOT0DEXOuc0Wqoj1bs9sROT8kxUFKzfnW4XVrs 2kInnZdzBTBo3XcXgbZ7T6wJwwdhBihIUMFwXOfh345TzKyWf2XLW7suhwEDBU1jbw8/9/uRPKC e7WpB7PgMAg7Jhct93rjdwtHxe3AevhrX3+63Y4lvVXn0gfp/tGuL2Ibl6V7TKg4fKhWJ2uXtKA knnJGUeeyF1DBT63XqXPlQogqMff2bZRYpFcNRDed8lRgPTdR4uetp2LRTGV87Kz244fYzIKQHo 5UrEdLm8WgyY1+jNWtfOhSAKy7rU/zu9Ume9/1LXfDTpKE2rpA/7tWA1CvIk6VtdTVgEAkaN4o8 4ZY4bM4ZpB9MwFQ== 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 Fri Jun 12 21:38:11 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 DFBB44C77CA; Tue, 12 May 2026 11:12:53 +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=1778584377; cv=none; b=J+UWasSI36H7xLW4dwRtSolNt1NBrNDhF8Cn2g6sdmACAMnBvwyGmnjGHUFM6bxP2a1FB6kk48jOfTt87p+YYzJBp0u0Ktsr4QVVjh6IWAjwRDX+s/cul2NsWAaPMB4iYRjbficprnenGBTNSxwjRVYJogi+JEWd4LAJ78y+zx8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584377; 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=d7eL70s1ZB4eD1exNM/NkdcxuDOAdcQDv/LO6kFt9F8ylkSWb8jR/CFCSJTXd1lM28RT60ex+PghxzWY/X2go60JR3Y9MfrbnVhV5o0E6mt+rOqf3/UAsznoBjXGX5E9fwtWv/4v80FBEjEmNmRSyqFeskDHkAWkDdmiUWoDIRs= 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=LKPRWCBA; 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="LKPRWCBA" 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=LKPRWCBAC2hyXBPAD8C11iwkE2 03MuAUKgo8NHqAmFr9U7LCtRYW6DFlRo1uvOt7eEgmWFdhthczO8ec94r9zw/n1/ClwY6CJY3D4rC Ds+/6x/FtncN/3PTx9/kWK8giM/s7eTqER6HfNz5o+H1zPQKJCJPNUCpKluuBIGdvEI5Boly0ynwp Tr9LqWijY5vOpT3VFRbDi5LOnpYzd+GYTee8cOqffD5gg1A9mXSS6euC4vhlgiVk6UTnXB2CjuAEe CyNLey8ApQrk59f8U9Ivu+NmsXOiWAct1dl2ReXcQyN/j4GvWSzfk3KnuvA9+QKVH93mt/RCvdeyV 7VJk8Yag==; 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 1wMl2f-002KrE-21; Tue, 12 May 2026 11:12:50 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:19 -0700 Subject: [PATCH net-next v2 4/6] 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: <20260512-getsock_three-v2-4-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsbSlHBuCyV0Iex8JpSX1NlX8R0S6ZpxyFj9 mHgXi51wv+JAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGwAKCRA1o5Of/Hh3 bV2hD/9yUWKl+T/j3Gkf4xO1awNWtObVqfcYIygFEes3EduMBmyAEkbWMrOaCGrm4CszwGW7pvo P0U0VCIBRVE7HdDsAq5pggMXMAOUkyAs7q3SJs8pnYtAZJFcmR9/updokY1St4dA4FyyQC/QkkD xhUJphXP6WRvyI0q8Lj5VK5Ty8ACEgaVaDjjshnZH3ilNrfruI2W+HZ0Z5codzEVun41dnHL28T DEtZfFj+Z5DMTkAPWqeR3mwYXSzphL3Sn1RU+BEsvlTK+X3eYgrCMxNrDhF+evkMw10/qYBCfdO WeHngPII5XeUDAuyNZ9Jr+xVj9IpNyNs+2ic+eaBMQHhfRSvvVT2yoR5OSf5c67LL5RlzzL/x7T tq5pcjgdi4iahZndEcdNX5nwOym8WQbsvUGRuf7zs/rTzlEAUD8sMI2cULjEnmjGRJXMN2cRcB2 CeJRdaUFwRIPbBoe6tu+KPZISxlOaOd9vAoIzHodrq9wT43Ksd+yTYN36xeevk+easwcsye90lb jzBPwjQ9IyXN57JqlKBZ3BPXQJ/BG41zZ2OF+YP6XGM/Xx1XdThsEr3T2QC43PNASR1mf7g5L93 EqYAj2GYcir4QjoueLb2EtQ6dQRH7Ht/rvtIo6IkKsnnJ+jkY4Wbj6ChOqGYRS+/xW/TN4sxmaF RqoC6Nt25Lml7Iw== 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 Fri Jun 12 21:38:11 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 EC44247AF65; Tue, 12 May 2026 11:12: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=1778584382; cv=none; b=Ho7BtoHjAI+dreb1y6YjvuyIuQcOmmbQdAEKmIq/1cyZBZiTH12KyNL8D2kbPlaA6H6HIaVisHexSjFLVeWXkYz8IPFy4m7qa16FzvXXo5K4Fq6YHpAtAGuPh5u+iC9/id3eeqWVuq6uKmd1tENGe5oy4CpoPezeOl9wwag+jzc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584382; c=relaxed/simple; bh=RXdB+OMQFTCr5HzIoLQwuXJ2Je8Y6jzyknXHxP/EeU0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qq1+PfkpEVULUMt407aTsfvmX0Dn0TsBlKvc4G1A/6QV8v0/13sMFCK0xCOnSl5TAKkdSpKBXIT3kuI03wXeW1tGA+ZRoYXmldQ1nTID98DgcAdyMO6Fgs3aKP8OaEq5/Wa38kqOB79OEGaNB4n1qlkqKEnsjm9gbSEDiJ32OEY= 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=cfBD/5Ka; 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="cfBD/5Ka" 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=cfBD/5KaAQm/L76kgjhvJIWQ+A XuSEDaQF/WmzO7FOSdMSEnoxy7E2Xi6lZsDcTdBu0cbPZ65B1WNsw/nER+gPbAMpxrNWC2YfJyjrU /G08DMoF4GPeccqzJ8wvh5ZjK/eKXJNJKhd9dZ6ELwPAneNY8HG27fHY9FQqNltsuODRcctbrL1s8 JZ0I/chyU8DXBq6cMCi6gB/OWnp1sURprKT66Iw3KQqdusYuqOrcOE/9naDsj9Nkge9m46ks1t3lG J10BHkvZxIkeY4F5Xi0hc+f9Kk1kBazPAN9vZkxKNpo2pZYB5d1x95Dc9IZOfJAZ3fUCMZIaH2AaE aha4Ay6g==; 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 1wMl2k-002KrU-10; Tue, 12 May 2026 11:12:54 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:20 -0700 Subject: [PATCH net-next v2 5/6] 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: <20260512-getsock_three-v2-5-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsbWDXfU7l0c6r+mJOdEQg6h/Id/udrXCm3d sEvvP1RTWSJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGwAKCRA1o5Of/Hh3 bVjZEACdtJXbaS35fIqlEG80a3duhJkPz+Az7acMyVXjGS+UUOBkCnQzJoxLelsfVdgFVyjSfGo +17V9fZXN2+l/XoDc+5AM99MeSfG7INfp4n57/P3djJ2HH/76xkO4jUdSXwNPejmrNG31jf2lKO MKUjcOL4YJvRN7ekRkGzOzAdoaVfEwGfmul8192rlsxwI9z0AG7a/2n77FVe5Bxkv4NBumWNz6/ qf8dL8d7U4MHtjQwFlTVBkNp5+geKjrZ/NiwDvbZvnoh11n1TsrN82UqLjs4LNTXmhJBm+a3pme mCOtXsfEzp7CeQ1D6Rt8qAp5anNLorHTDMgdLrV+oHK7PaK4E36jvXHlsPYasUhcqmO1o9pV0BR WmT4/0GFV9tfV4o2U9yfsAGm9jKQuRxwUoNiOY3gkX9ncoJVGWRsWlsSSfOAtPo+WZWAkcS3f2b Vk07Gm46PcwX28DWYLTgEATlrY62cOSc0nKmfdZklwwPPaxRCOi6JPjyUXu4nmW4hTKQiTO3AZe G/nFDn9ZNZ2sy7Ut1U95woG3zP12r7F8SBHlPwlsuC6SDeg1KzVa+AWMQALdbN3aypY7V1ZO5j3 wxoF8wtQdGWHO7eh2iue8bueD+WGwK+GcGtjrSJb0FRYlYqdFO52qChwnMdOfl1Af8E0K4rPXwy kid3UdRNLAjijag== 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 Fri Jun 12 21:38:11 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 47EEF4CA277; Tue, 12 May 2026 11:13: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=1778584386; cv=none; b=WU9bkXMp5+gYsuteEyUO2t4oLxEVt5xVYWhvbRv/sSxTZuJ87lBaXLYnADH7U4Ezu3nlsiQ/kDBszlPDUyH7Nqv9Hx3tnILV1fyom+l6Y/0dGHP7/v7630p3PtwvLmpqkvmOnUxyk8oybJX4Kj9Sfi1OPGFGP2DK1MNhGTlRJqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778584386; c=relaxed/simple; bh=2v3FBFlG0XjBuZMc0nVvHHUoBstblBc5qcpRFYUU7T4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ndTc6izgPcFVKrqWEZlm1xD9EAXneew2ODQYGlWJyib+RF4qvsWyToGu9PojX0RpEBNPnyKYEkKqixglSaM7yRUDpX/fZEEXc/CPdVFCAIjaBOvxiM+VhdUY6UIQ6SjoTQVR21cQVa0llGhjE5dcGxfcsJIvUASUzB2M5hw3yM4= 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=icEEmoCy; 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="icEEmoCy" 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=icEEmoCyygM8noKLMoIRrvVITd CAWy7Ix6wAcbol/UrwbYgi9XyCxpqZzDNrJ45NqNvs3TZHLUjoyiXb8WhjgYDTXcY61abZk2+25lf ISCiv5iTtZ/oJBLz4b1P8vvMpMCFu9ayk2rS2PC/yY3e6Z9gS7o3WHpVeIk6yWJOK+hvHTfDml250 48F4FSsWfsQEkdpulzGtXh8XQGNashq8JzVRiUIF7NRcg5pHMvnx9w0/fGq7TXO5234QGtxs1lEfA zx31i1EWNtSZiV59TfzhTl0RgAFzprB4ELhVj58qM27pz1dGcyeONCSk7YCAzY9jJx1zd8JNfa+Vo h7J5L7tw==; 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 1wMl2o-002Krf-2A; Tue, 12 May 2026 11:12:59 +0000 From: Breno Leitao Date: Tue, 12 May 2026 04:12:21 -0700 Subject: [PATCH net-next v2 6/6] 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: <20260512-getsock_three-v2-6-30b7b22ef14c@debian.org> References: <20260512-getsock_three-v2-0-30b7b22ef14c@debian.org> In-Reply-To: <20260512-getsock_three-v2-0-30b7b22ef14c@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 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/8eHdtAcsmYgBqAwsbU95wiOSOFMiV4tHtQrZCyd2DmUI0/pM7t XKE2/SqxLiJAjMEAAEIAB0WIQSshTmm6PRnAspKQ5s1o5Of/Hh3bQUCagMLGwAKCRA1o5Of/Hh3 bRMzD/wJzDebz0Li02MwVF4TMs59AVjzwFrtgjEJq20MwjMRhMZoKpt0vxFi3Ir84RvlEZhLJB7 FMf9E9y80qvL5tu09zPhxHZyKXVQDDmkMfrHEFsZ8SI8nIJC/maBqrThR6vS38ty1UY6QeEOiz1 AJaAstJsAeCP2aTv16VfSb6t9IXFEV+ke7xnPtgami7Q3LzyT0LLmtY8BBiHm8fd9LbFfBpE/5g QyRECgN5kRiIY9FsAApk+t2skz5k3Nl8dLUV0E6bwsSYsi7/cijCKTHPHLh5ew9dUoXPuTmFgEP J8nWAU/oRwmNoCy2/2XZXFek424oqCNWVkBjByfrmvQIYaqJZa2okR1y/pBGcJNswZcNVgZf86A uW1vYPHqwcIgZfyPAfsyAK+amehiXTwFRr3YaEVo47JoWxGLuICDLRC42aYE3tc4aZhaIZKKQeW kN7wjlSNteWQ7/XP98jXxbqUPOlqvd3gAmmnLpoNrLqzJB2+SVjX4Ktn+LDwR5glr53TNhxioFn yk4TIclgIi77EH427h3rdjNaxrPUPb0LFKii+B+36Aj4sYhknIoXm990bA8wXMPzNe7o4KnPJce viQQyYFh2hxpJBqx4X2F+1Pol3LbnaVZgHkLfv0O6MMMirrDy0nJXyQqh4EJH3tjf43LMhdqcWu cIMJ8iCVnQQfQjA== 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