mirror of
https://github.com/torvalds/linux.git
synced 2024-12-12 14:12:51 +00:00
Bluetooth: Fix accepting connect requests for defer_setup
When authentication completes we shouldn't blindly accept any pending L2CAP connect requests. If the socket has the defer_setup feature enabled it should still wait for user space acceptance of the connect request. The issue only happens for non-SSP connections since with SSP the L2CAP Connect request may not be sent for non-SDP PSMs before authentication has completed successfully. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
This commit is contained in:
parent
6fdf658c9a
commit
df3c3931ec
@ -4002,21 +4002,30 @@ static int l2cap_security_cfm(struct hci_conn *hcon, u8 status, u8 encrypt)
|
|||||||
}
|
}
|
||||||
} else if (sk->sk_state == BT_CONNECT2) {
|
} else if (sk->sk_state == BT_CONNECT2) {
|
||||||
struct l2cap_conn_rsp rsp;
|
struct l2cap_conn_rsp rsp;
|
||||||
__u16 result;
|
__u16 res, stat;
|
||||||
|
|
||||||
if (!status) {
|
if (!status) {
|
||||||
sk->sk_state = BT_CONFIG;
|
if (bt_sk(sk)->defer_setup) {
|
||||||
result = L2CAP_CR_SUCCESS;
|
struct sock *parent = bt_sk(sk)->parent;
|
||||||
|
res = L2CAP_CR_PEND;
|
||||||
|
stat = L2CAP_CS_AUTHOR_PEND;
|
||||||
|
parent->sk_data_ready(parent, 0);
|
||||||
|
} else {
|
||||||
|
sk->sk_state = BT_CONFIG;
|
||||||
|
res = L2CAP_CR_SUCCESS;
|
||||||
|
stat = L2CAP_CS_NO_INFO;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
sk->sk_state = BT_DISCONN;
|
sk->sk_state = BT_DISCONN;
|
||||||
l2cap_sock_set_timer(sk, HZ / 10);
|
l2cap_sock_set_timer(sk, HZ / 10);
|
||||||
result = L2CAP_CR_SEC_BLOCK;
|
res = L2CAP_CR_SEC_BLOCK;
|
||||||
|
stat = L2CAP_CS_NO_INFO;
|
||||||
}
|
}
|
||||||
|
|
||||||
rsp.scid = cpu_to_le16(chan->dcid);
|
rsp.scid = cpu_to_le16(chan->dcid);
|
||||||
rsp.dcid = cpu_to_le16(chan->scid);
|
rsp.dcid = cpu_to_le16(chan->scid);
|
||||||
rsp.result = cpu_to_le16(result);
|
rsp.result = cpu_to_le16(res);
|
||||||
rsp.status = cpu_to_le16(L2CAP_CS_NO_INFO);
|
rsp.status = cpu_to_le16(stat);
|
||||||
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
l2cap_send_cmd(conn, chan->ident, L2CAP_CONN_RSP,
|
||||||
sizeof(rsp), &rsp);
|
sizeof(rsp), &rsp);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user