]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: L2CAP: Fix type confusion in l2cap_ecred_reconf_rsp()
authorLukas Johannes Möller <research@johannes-moeller.dev>
Tue, 10 Mar 2026 21:59:46 +0000 (21:59 +0000)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 12 Mar 2026 19:28:46 +0000 (15:28 -0400)
l2cap_ecred_reconf_rsp() casts the incoming data to struct
l2cap_ecred_conn_rsp (the ECRED *connection* response, 8 bytes with
result at offset 6) instead of struct l2cap_ecred_reconf_rsp (2 bytes
with result at offset 0).

This causes two problems:

 - The sizeof(*rsp) length check requires 8 bytes instead of the
   correct 2, so valid L2CAP_ECRED_RECONF_RSP packets are rejected
   with -EPROTO.

 - rsp->result reads from offset 6 instead of offset 0, returning
   wrong data when the packet is large enough to pass the check.

Fix by using the correct type.  Also pass the already byte-swapped
result variable to BT_DBG instead of the raw __le16 field.

Fixes: 15f02b910562 ("Bluetooth: L2CAP: Add initial code for Enhanced Credit Based Mode")
Cc: stable@vger.kernel.org
Signed-off-by: Lukas Johannes Möller <research@johannes-moeller.dev>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/l2cap_core.c

index 9d5b8d4d375a5fd53434849236aaa176f3bb1120..08a12515bfed95e77b329e56562f734d3fd0229e 100644 (file)
@@ -5428,7 +5428,7 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn,
                                         u8 *data)
 {
        struct l2cap_chan *chan, *tmp;
-       struct l2cap_ecred_conn_rsp *rsp = (void *) data;
+       struct l2cap_ecred_reconf_rsp *rsp = (void *)data;
        u16 result;
 
        if (cmd_len < sizeof(*rsp))
@@ -5436,7 +5436,7 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn,
 
        result = __le16_to_cpu(rsp->result);
 
-       BT_DBG("result 0x%4.4x", rsp->result);
+       BT_DBG("result 0x%4.4x", result);
 
        if (!result)
                return 0;