Skip to content

Commit 78b99eb

Browse files
fdanis-ossVudentz
authored andcommitted
Bluetooth: L2CAP: Send reject on command corrupted request
L2CAP/COS/CED/BI-02-C PTS test send a malformed L2CAP signaling packet with 2 commands in it (a connection request and an unknown command) and expect to get a connection response packet and a command reject packet. The second is currently not sent. Cc: stable@vger.kernel.org Signed-off-by: Frédéric Danis <frederic.danis@collabora.com> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
1 parent 50efc63 commit 78b99eb

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

net/bluetooth/l2cap_core.c

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6492,6 +6492,14 @@ static inline void l2cap_le_sig_channel(struct l2cap_conn *conn,
64926492
kfree_skb(skb);
64936493
}
64946494

6495+
static inline void l2cap_sig_send_rej(struct l2cap_conn *conn, u16 ident)
6496+
{
6497+
struct l2cap_cmd_rej_unk rej;
6498+
6499+
rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
6500+
l2cap_send_cmd(conn, ident, L2CAP_COMMAND_REJ, sizeof(rej), &rej);
6501+
}
6502+
64956503
static inline void l2cap_sig_channel(struct l2cap_conn *conn,
64966504
struct sk_buff *skb)
64976505
{
@@ -6517,23 +6525,24 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn,
65176525

65186526
if (len > skb->len || !cmd->ident) {
65196527
BT_DBG("corrupted command");
6528+
l2cap_sig_send_rej(conn, cmd->ident);
65206529
break;
65216530
}
65226531

65236532
err = l2cap_bredr_sig_cmd(conn, cmd, len, skb->data);
65246533
if (err) {
6525-
struct l2cap_cmd_rej_unk rej;
6526-
65276534
BT_ERR("Wrong link type (%d)", err);
6528-
6529-
rej.reason = cpu_to_le16(L2CAP_REJ_NOT_UNDERSTOOD);
6530-
l2cap_send_cmd(conn, cmd->ident, L2CAP_COMMAND_REJ,
6531-
sizeof(rej), &rej);
6535+
l2cap_sig_send_rej(conn, cmd->ident);
65326536
}
65336537

65346538
skb_pull(skb, len);
65356539
}
65366540

6541+
if (skb->len > 0) {
6542+
BT_DBG("corrupted command");
6543+
l2cap_sig_send_rej(conn, 0);
6544+
}
6545+
65376546
drop:
65386547
kfree_skb(skb);
65396548
}

0 commit comments

Comments
 (0)