Skip to content

Commit

Permalink
Bluetooth: Lock socket when reading HCI socket options
Browse files Browse the repository at this point in the history
When reading the HCI raw socket option, the socket was never locked. So
lock the socket and in addition return EINVAL on non raw sockets.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
  • Loading branch information
Marcel Holtmann authored and Johan Hedberg committed Feb 20, 2012
1 parent 2f39cdb commit cedc546
Showing 1 changed file with 17 additions and 6 deletions.
23 changes: 17 additions & 6 deletions net/bluetooth/hci_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,11 +677,20 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
{
struct hci_ufilter uf;
struct sock *sk = sock->sk;
int len, opt;
int len, opt, err = 0;

BT_DBG("sk %p, opt %d", sk, optname);

if (get_user(len, optlen))
return -EFAULT;

lock_sock(sk);

if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
err = -EINVAL;
goto done;
}

switch (optname) {
case HCI_DATA_DIR:
if (hci_pi(sk)->cmsg_mask & HCI_CMSG_DIR)
Expand All @@ -690,7 +699,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
opt = 0;

if (put_user(opt, optval))
return -EFAULT;
err = -EFAULT;
break;

case HCI_TIME_STAMP:
Expand All @@ -700,7 +709,7 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char
opt = 0;

if (put_user(opt, optval))
return -EFAULT;
err = -EFAULT;
break;

case HCI_FILTER:
Expand All @@ -715,15 +724,17 @@ static int hci_sock_getsockopt(struct socket *sock, int level, int optname, char

len = min_t(unsigned int, len, sizeof(uf));
if (copy_to_user(optval, &uf, len))
return -EFAULT;
err = -EFAULT;
break;

default:
return -ENOPROTOOPT;
err = -ENOPROTOOPT;
break;
}

return 0;
done:
release_sock(sk);
return err;
}

static const struct proto_ops hci_sock_ops = {
Expand Down

0 comments on commit cedc546

Please sign in to comment.