Re: [PATCH 1/2] Bluetooth: ISO: Fix data-race on dst in iso_sock_connect()
From: Luiz Augusto von Dentz
Date: Mon Apr 20 2026 - 15:25:50 EST
Hi SeungJu,
On Sat, Apr 18, 2026 at 1:34 AM SeungJu Cheon <suunj1331@xxxxxxxxx> wrote:
>
> iso_sock_connect() copies the destination address into
> iso_pi(sk)->dst under lock_sock, then releases the lock and reads
> it back with bacmp() to decide between the CIS and BIS connect
> paths:
>
> lock_sock(sk);
> bacpy(&iso_pi(sk)->dst, &sa->iso_bdaddr);
> iso_pi(sk)->dst_type = sa->iso_bdaddr_type;
> release_sock(sk);
>
> if (bacmp(&iso_pi(sk)->dst, BDADDR_ANY)) // <- no lock held
>
> This read after release_sock() races with any concurrent write to
> iso_pi(sk)->dst on the same socket.
>
> Fix by performing the bacmp() inside the lock_sock critical section
> and caching the result in a local variable.
>
> This patch addresses only the bacmp() race in iso_sock_connect();
> other unprotected iso_pi(sk) accesses are fixed separately in the
> next patch.
>
> KCSAN report:
>
> BUG: KCSAN: data-race in memcmp+0x39/0xb0
>
> race at unknown origin, with read to 0xffff8f96ea66dde3 of 1 bytes by task 549 on cpu 1:
> memcmp+0x39/0xb0
> iso_sock_connect+0x275/0xb40
> __sys_connect_file+0xbd/0xe0
> __sys_connect+0xe0/0x110
> __x64_sys_connect+0x40/0x50
> x64_sys_call+0xcad/0x1c60
> do_syscall_64+0x133/0x590
> entry_SYSCALL_64_after_hwframe+0x77/0x7f
>
> value changed: 0x00 -> 0xee
>
> Reported by Kernel Concurrency Sanitizer on:
> CPU: 1 UID: 0 PID: 549 Comm: iso_race_combin Not tainted 7.0.0-08391-g1d51b370a0f8 #40 PREEMPT(lazy)
>
> Fixes: ccf74f2390d6 ("Bluetooth: Add BTPROTO_ISO socket type")
> Signed-off-by: SeungJu Cheon <suunj1331@xxxxxxxxx>
> ---
> net/bluetooth/iso.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/net/bluetooth/iso.c b/net/bluetooth/iso.c
> index be145e2736b7..14963ba68597 100644
> --- a/net/bluetooth/iso.c
> +++ b/net/bluetooth/iso.c
> @@ -1169,6 +1169,7 @@ static int iso_sock_connect(struct socket *sock, struct sockaddr_unsized *addr,
> struct sockaddr_iso *sa = (struct sockaddr_iso *)addr;
> struct sock *sk = sock->sk;
> int err;
> + bool bcast;
>
> BT_DBG("sk %p", sk);
>
> @@ -1191,9 +1192,11 @@ static int iso_sock_connect(struct socket *sock, struct sockaddr_unsized *addr,
> bacpy(&iso_pi(sk)->dst, &sa->iso_bdaddr);
> iso_pi(sk)->dst_type = sa->iso_bdaddr_type;
>
> + bcast = !bacmp(&iso_pi(sk)->dst, BDADDR_ANY);
> +
> release_sock(sk);
>
> - if (bacmp(&iso_pi(sk)->dst, BDADDR_ANY))
> + if (!bcast)
> err = iso_connect_cis(sk);
> else
> err = iso_connect_bis(sk);
> --
> 2.52.0
>
https://sashiko.dev/#/patchset/20260418053401.128483-1-suunj1331%40gmail.com
Seems valid, so we migth just use sa in the place of iso_pi(sk) to
avoid using it without sk being locked. Other problems it may reveal
need to be addressed in separate patches.
--
Luiz Augusto von Dentz