aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2013-04-29 12:35:37 -0400
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>2013-06-22 19:23:47 -0400
commit141d57065afd11977c4d346f64b25350445bf689 (patch)
treec33d9f462442a3916c7bdb270975836c5be71d33 /net
parentf224ca5fc207a9957164e6f42ec6766da0f55d54 (diff)
Bluetooth: Fix EBUSY condition test in l2cap_chan_connect
The current test in l2cap_chan_connect is intended to protect against multiple conflicting connect attempts. However, it assumes that there will ever only be a single CID that is connected to, which is not true. We do need to check for conflicts with connect attempts to the same destination CID but this check is not in anyway specific to LE but can be applied to BR/EDR as well. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
Diffstat (limited to 'net')
-rw-r--r--net/bluetooth/l2cap_core.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 29398293d501..640423b4f411 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -1811,16 +1811,10 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
1811 goto done; 1811 goto done;
1812 } 1812 }
1813 1813
1814 if (hcon->type == LE_LINK) { 1814 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
1815 err = 0; 1815 hci_conn_drop(hcon);
1816 1816 err = -EBUSY;
1817 if (!list_empty(&conn->chan_l)) { 1817 goto done;
1818 err = -EBUSY;
1819 hci_conn_drop(hcon);
1820 }
1821
1822 if (err)
1823 goto done;
1824 } 1818 }
1825 1819
1826 /* Update source addr of the socket */ 1820 /* Update source addr of the socket */