Re: [PATCH 1/2] Bluetooth: ISO: Fix data-race on dst in iso_sock_connect()
Luiz Augusto von Dentz <[email protected]>
| Newsgroups | dev.linux.lists.linux-kernel-mentees,org.kernel.vger.linux-bluetooth,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <CABBYNZLBoU3byfK_G+=sTkBx3wNwEh2X6_7dG4+4LFtrc3Skpw@mail.gmail.com> |
Hi SeungJu, On Sat, Apr 18, 2026 at 1:34 AM SeungJu Cheon <[email protected]> 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 <[email protected]> > --- > 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