]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: l2cap: Add missing chan lock in l2cap_ecred_reconf_rsp
authorDudu Lu <phx0fer@gmail.com>
Sun, 5 Apr 2026 15:47:41 +0000 (23:47 +0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 13 Apr 2026 13:19:42 +0000 (09:19 -0400)
l2cap_ecred_reconf_rsp() calls l2cap_chan_del() without holding
l2cap_chan_lock(). Every other l2cap_chan_del() caller in the file
acquires the lock first. A remote BLE device can send a crafted
L2CAP ECRED reconfiguration response to corrupt the channel list
while another thread is iterating it.

Add l2cap_chan_hold() and l2cap_chan_lock() before l2cap_chan_del(),
and l2cap_chan_unlock() and l2cap_chan_put() after, matching the
pattern used in l2cap_ecred_conn_rsp() and l2cap_conn_del().

Fixes: 15f02b910562 ("Bluetooth: L2CAP: Add initial code for Enhanced Credit Based Mode")
Signed-off-by: Dudu Lu <phx0fer@gmail.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/l2cap_core.c

index 5a4cd530ef33c04b146ae88046e47f944b870236..77dec104a9c367775890563aec6a1d54b8b289ed 100644 (file)
@@ -5473,7 +5473,13 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn,
                if (chan->ident != cmd->ident)
                        continue;
 
+               l2cap_chan_hold(chan);
+               l2cap_chan_lock(chan);
+
                l2cap_chan_del(chan, ECONNRESET);
+
+               l2cap_chan_unlock(chan);
+               l2cap_chan_put(chan);
        }
 
        return 0;