Skip to content

Commit

Permalink
Bluetooth: Restrict to one SCO listening socket
Browse files Browse the repository at this point in the history
The SCO sockets are only identified by its address. So only allow one
SCO socket in listening state per address or BDADDR_ANY.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
  • Loading branch information
Marcel Holtmann authored and Gustavo Padovan committed May 9, 2012
1 parent 8ed21f7 commit fb33405
Showing 1 changed file with 22 additions and 7 deletions.
29 changes: 22 additions & 7 deletions net/bluetooth/sco.c
Original file line number Diff line number Diff line change
Expand Up @@ -273,17 +273,20 @@ static inline void sco_recv_frame(struct sco_conn *conn, struct sk_buff *skb)
}

/* -------- Socket interface ---------- */
static struct sock *__sco_get_sock_by_addr(bdaddr_t *ba)
static struct sock *__sco_get_sock_listen_by_addr(bdaddr_t *ba)
{
struct sock *sk;
struct hlist_node *node;
struct sock *sk;

sk_for_each(sk, node, &sco_sk_list.head) {
if (sk->sk_state != BT_LISTEN)
continue;

sk_for_each(sk, node, &sco_sk_list.head)
if (!bacmp(&bt_sk(sk)->src, ba))
goto found;
sk = NULL;
found:
return sk;
return sk;
}

return NULL;
}

/* Find socket listening on source bdaddr.
Expand Down Expand Up @@ -529,6 +532,7 @@ static int sco_sock_connect(struct socket *sock, struct sockaddr *addr, int alen
static int sco_sock_listen(struct socket *sock, int backlog)
{
struct sock *sk = sock->sk;
bdaddr_t *src = &bt_sk(sk)->src;
int err = 0;

BT_DBG("sk %p backlog %d", sk, backlog);
Expand All @@ -545,10 +549,21 @@ static int sco_sock_listen(struct socket *sock, int backlog)
goto done;
}

write_lock(&sco_sk_list.lock);

if (__sco_get_sock_listen_by_addr(src)) {
err = -EADDRINUSE;
goto unlock;
}

sk->sk_max_ack_backlog = backlog;
sk->sk_ack_backlog = 0;

sk->sk_state = BT_LISTEN;

unlock:
write_unlock(&sco_sk_list.lock);

done:
release_sock(sk);
return err;
Expand Down

0 comments on commit fb33405

Please sign in to comment.