From: Karl Mehltretter <kmehltretter@gmail.com>
To: stable@vger.kernel.org
Cc: Karl Mehltretter <kmehltretter@gmail.com>,
gregkh@linuxfoundation.org, sashal@kernel.org,
luiz.dentz@gmail.com, luiz.von.dentz@intel.com,
marcel@holtmann.org, johan.hedberg@gmail.com, eadavis@qq.com,
davem@davemloft.net, kuba@kernel.org,
linux-bluetooth@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, patches@lists.linux.dev,
pav@iki.fi,
syzbot+b7f6f8c9303466e16c8a@syzkaller.appspotmail.com
Subject: [PATCH 5.15.y 2/2] bluetooth/l2cap: sync sock recv cb and release
Date: Thu, 17 Sep 2026 06:00:04 +0200 [thread overview]
Message-ID: <20260917040004.21041-3-kmehltretter@gmail.com> (raw)
In-Reply-To: <20260917040004.21041-1-kmehltretter@gmail.com>
From: Edward Adam Davis <eadavis@qq.com>
[ Upstream commit 89e856e124f9ae548572c56b1b70c2255705f8fe ]
The problem occurs between the system call to close the sock and hci_rx_work,
where the former releases the sock and the latter accesses it without lock protection.
CPU0 CPU1
---- ----
sock_close hci_rx_work
l2cap_sock_release hci_acldata_packet
l2cap_sock_kill l2cap_recv_frame
sk_free l2cap_conless_channel
l2cap_sock_recv_cb
If hci_rx_work processes the data that needs to be received before the sock is
closed, then everything is normal; Otherwise, the work thread may access the
released sock when receiving data.
Add a chan mutex in the rx callback of the sock to achieve synchronization between
the sock release and recv cb.
Sock is dead, so set chan data to NULL, avoid others use invalid sock pointer.
Reported-and-tested-by: syzbot+b7f6f8c9303466e16c8a@syzkaller.appspotmail.com
Signed-off-by: Edward Adam Davis <eadavis@qq.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
[ Karl Mehltretter: applied in the form this commit has after
f1a8f402f13f ("Bluetooth: L2CAP: Fix deadlock"), that is the
chan->data clearing in l2cap_sock_kill() and the guard in
l2cap_sock_recv_cb(), without the channel locking in the callback.
That locking is what caused the recursive chan->lock deadlock.
f1a8f402f13f removes it and moves the lock to l2cap_conless_channel(),
which the previous patch does here. l2cap_data_channel() already
obtains the channel locked from l2cap_get_chan_by_scid(). ]
Assisted-by: LLM
Signed-off-by: Karl Mehltretter <kmehltretter@gmail.com>
---
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 0b51c3e0f469..bef6a948d7d5 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -1237,6 +1237,10 @@ static void l2cap_sock_kill(struct sock *sk)
BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
+ /* Sock is dead, so set chan data to NULL, avoid other task use invalid
+ * sock pointer.
+ */
+ l2cap_pi(sk)->chan->data = NULL;
/* Kill poor orphan */
l2cap_chan_put(l2cap_pi(sk)->chan);
@@ -1519,9 +1523,13 @@ static struct l2cap_chan *l2cap_sock_new_connection_cb(struct l2cap_chan *chan)
static int l2cap_sock_recv_cb(struct l2cap_chan *chan, struct sk_buff *skb)
{
- struct sock *sk = chan->data;
+ struct sock *sk;
int err;
+ sk = chan->data;
+ if (!sk)
+ return -ENXIO;
+
lock_sock(sk);
if (l2cap_pi(sk)->rx_busy_skb) {
--
2.51.0
next prev parent reply other threads:[~2026-09-17 4:00 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-12 6:50 [PATCH 5.15 000/935] 5.15.221-rc1 review Greg Kroah-Hartman
2026-09-12 17:43 ` Brett A C Sheffield
2026-09-12 18:07 ` Barry K. Nathan
[not found] ` <82fb64b5-4273-4cb3-be34-ed9fd2d0dd94@w6rz.net>
2026-09-13 11:26 ` Sasha Levin
2026-09-13 23:23 ` Ron Economos
2026-09-14 17:26 ` Florian Fainelli
[not found] ` <20260912065546.976652519@linuxfoundation.org>
[not found] ` <20260913202907.3100-1-kmehltretter@gmail.com>
2026-09-17 4:00 ` [PATCH 5.15.y 0/2] Bluetooth: L2CAP: fix connectionless receive path Karl Mehltretter
2026-09-17 4:00 ` [PATCH 5.15.y 1/2] Bluetooth: L2CAP: Fix deadlock Karl Mehltretter
2026-09-17 4:00 ` Karl Mehltretter [this message]
2026-09-18 0:52 ` [PATCH 5.15.y 0/2] Bluetooth: L2CAP: fix connectionless receive path Sasha Levin
2026-09-18 4:28 ` [PATCH 5.15 000/935] 5.15.221-rc1 review Guenter Roeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260917040004.21041-3-kmehltretter@gmail.com \
--to=kmehltretter@gmail.com \
--cc=davem@davemloft.net \
--cc=eadavis@qq.com \
--cc=gregkh@linuxfoundation.org \
--cc=johan.hedberg@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=luiz.von.dentz@intel.com \
--cc=marcel@holtmann.org \
--cc=netdev@vger.kernel.org \
--cc=patches@lists.linux.dev \
--cc=pav@iki.fi \
--cc=sashal@kernel.org \
--cc=stable@vger.kernel.org \
--cc=syzbot+b7f6f8c9303466e16c8a@syzkaller.appspotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®