Bluetooth: Limit HCI raw socket options to actual raw sockets
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 20 Feb 2012 13:50:32 +0000 (14:50 +0100)
committerJohan Hedberg <johan.hedberg@intel.com>
Mon, 20 Feb 2012 13:55:54 +0000 (15:55 +0200)
Currently the socket options of HCI sockets can be set on raw and control
sockets, but on control sockets they make no sense. So just return EINVAL
in that case.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
net/bluetooth/hci_sock.c

index b5b3bc8d28489af10eafcdea76b0768badd98cf5..612bc2af05a9632440645fec8b64afefbe876561 100644 (file)
@@ -601,6 +601,11 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, char
 
        lock_sock(sk);
 
+       if (hci_pi(sk)->channel != HCI_CHANNEL_RAW) {
+               err = -EINVAL;
+               goto done;
+       }
+
        switch (optname) {
        case HCI_DATA_DIR:
                if (get_user(opt, (int __user *)optval)) {
@@ -663,6 +668,7 @@ static int hci_sock_setsockopt(struct socket *sock, int level, int optname, char
                break;
        }
 
+done:
        release_sock(sk);
        return err;
 }