Skip to content

Commit

Permalink
Bluetooth: Assign the channel early when binding HCI sockets
Browse files Browse the repository at this point in the history
Assignment of the hci_pi(sk)->channel should be done early when binding
the HCI socket. This avoids confusion with the RAW channel that is used
for legacy access.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
  • Loading branch information
Marcel Holtmann committed Sep 19, 2016
1 parent 0ef2c42 commit 5a6d2cf
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions net/bluetooth/hci_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -1045,6 +1045,7 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
atomic_inc(&hdev->promisc);
}

hci_pi(sk)->channel = haddr.hci_channel;
hci_pi(sk)->hdev = hdev;
break;

Expand Down Expand Up @@ -1107,9 +1108,10 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
}
}

atomic_inc(&hdev->promisc);

hci_pi(sk)->channel = haddr.hci_channel;
hci_pi(sk)->hdev = hdev;

atomic_inc(&hdev->promisc);
break;

case HCI_CHANNEL_MONITOR:
Expand All @@ -1123,6 +1125,8 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
goto done;
}

hci_pi(sk)->channel = haddr.hci_channel;

/* The monitor interface is restricted to CAP_NET_RAW
* capabilities and with that implicitly trusted.
*/
Expand All @@ -1149,6 +1153,8 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
err = -EPERM;
goto done;
}

hci_pi(sk)->channel = haddr.hci_channel;
break;

default:
Expand All @@ -1170,6 +1176,8 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
if (capable(CAP_NET_ADMIN))
hci_sock_set_flag(sk, HCI_SOCK_TRUSTED);

hci_pi(sk)->channel = haddr.hci_channel;

/* At the moment the index and unconfigured index events
* are enabled unconditionally. Setting them on each
* socket when binding keeps this functionality. They
Expand All @@ -1180,7 +1188,7 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
* received by untrusted users. Example for such events
* are changes to settings, class of device, name etc.
*/
if (haddr.hci_channel == HCI_CHANNEL_CONTROL) {
if (hci_pi(sk)->channel == HCI_CHANNEL_CONTROL) {
struct sk_buff *skb;

hci_sock_gen_cookie(sk);
Expand All @@ -1203,8 +1211,6 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
break;
}


hci_pi(sk)->channel = haddr.hci_channel;
sk->sk_state = BT_BOUND;

done:
Expand Down

0 comments on commit 5a6d2cf

Please sign in to comment.