summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2012-04-19 13:43:53 +0200
committerGustavo Padovan <gustavo@padovan.org>2012-05-09 01:40:38 -0300
commit8ed21f7eece54bb80eea5e31c3d9c6c7b6517e49 (patch)
tree40fffd8d1177b0cfb938ed86525f8638787d15e5
parentfc50744c1e518adfb4ff2eda156f941e20aea36d (diff)
downloadlinux-stable-8ed21f7eece54bb80eea5e31c3d9c6c7b6517e49.tar.gz
linux-stable-8ed21f7eece54bb80eea5e31c3d9c6c7b6517e49.tar.bz2
linux-stable-8ed21f7eece54bb80eea5e31c3d9c6c7b6517e49.zip
Bluetooth: Don't check source address in SCO bind function
Checking the source address in SCO bind function will prevent from having an incoming and outgoing SCO socket. However that might be needed in case of multiple SCO connections on a single device. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
-rw-r--r--net/bluetooth/sco.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 84d7a8023f80..c75cd7b07d18 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -462,7 +462,6 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le
{
struct sockaddr_sco *sa = (struct sockaddr_sco *) addr;
struct sock *sk = sock->sk;
- bdaddr_t *src = &sa->sco_bdaddr;
int err = 0;
BT_DBG("sk %p %s", sk, batostr(&sa->sco_bdaddr));
@@ -477,17 +476,14 @@ static int sco_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le
goto done;
}
- write_lock(&sco_sk_list.lock);
-
- if (bacmp(src, BDADDR_ANY) && __sco_get_sock_by_addr(src)) {
- err = -EADDRINUSE;
- } else {
- /* Save source address */
- bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
- sk->sk_state = BT_BOUND;
+ if (sk->sk_type != SOCK_SEQPACKET) {
+ err = -EINVAL;
+ goto done;
}
- write_unlock(&sco_sk_list.lock);
+ bacpy(&bt_sk(sk)->src, &sa->sco_bdaddr);
+
+ sk->sk_state = BT_BOUND;
done:
release_sock(sk);