Bluetooth: Fix handling of getsockname() for HCI sockets
authorMarcel Holtmann <marcel@holtmann.org>
Mon, 26 Aug 2013 07:20:37 +0000 (00:20 -0700)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Mon, 16 Sep 2013 17:35:54 +0000 (14:35 -0300)
The hci_dev check is not protected and so move it into the socket lock. In
addition return the HCI channel identifier instead of always 0 channel.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
net/bluetooth/hci_sock.c

index d8589410142fb862cf834ab06685e04ce49cb084..49c5c62ac0c92ccc315684ee16e3147eb657592e 100644 (file)
@@ -695,25 +695,30 @@ static int hci_sock_getname(struct socket *sock, struct sockaddr *addr,
 {
        struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr;
        struct sock *sk = sock->sk;
-       struct hci_dev *hdev = hci_pi(sk)->hdev;
+       struct hci_dev *hdev;
+       int err = 0;
 
        BT_DBG("sock %p sk %p", sock, sk);
 
        if (peer)
                return -EOPNOTSUPP;
 
-       if (!hdev)
-               return -EBADFD;
-
        lock_sock(sk);
 
+       hdev = hci_pi(sk)->hdev;
+       if (!hdev) {
+               err = -EBADFD;
+               goto done;
+       }
+
        *addr_len = sizeof(*haddr);
        haddr->hci_family = AF_BLUETOOTH;
        haddr->hci_dev    = hdev->id;
-       haddr->hci_channel= 0;
+       haddr->hci_channel= hci_pi(sk)->channel;
 
+done:
        release_sock(sk);
-       return 0;
+       return err;
 }
 
 static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,