Bluetooth: A2MP: Fix potential NULL dereference
authorAndrei Emeltchenko <andrei.emeltchenko@intel.com>
Fri, 28 Sep 2012 11:28:50 +0000 (14:28 +0300)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Mon, 1 Oct 2012 15:02:12 +0000 (12:02 -0300)
Return INVALID_CTRL_ID for unknown AMP controller and for BR/EDR
controller and fixes dereference possible NULL pointer.

Signed-off-by: Andrei Emeltchenko <andrei.emeltchenko@intel.com>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
net/bluetooth/a2mp.c

index 42788cdbb4febcadfba48048ac02c722ea5f618f..d4946b591b71c8a31e45fab2ebfc1ad7457fa5b9 100644 (file)
@@ -278,7 +278,7 @@ static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,
        BT_DBG("id %d", req->id);
 
        hdev = hci_dev_get(req->id);
-       if (!hdev) {
+       if (!hdev || hdev->dev_type != HCI_AMP) {
                struct a2mp_info_rsp rsp;
 
                rsp.id = req->id;
@@ -286,14 +286,16 @@ static int a2mp_getinfo_req(struct amp_mgr *mgr, struct sk_buff *skb,
 
                a2mp_send(mgr, A2MP_GETINFO_RSP, hdr->ident, sizeof(rsp),
                          &rsp);
-       }
 
-       if (hdev->dev_type != HCI_BREDR) {
-               mgr->state = READ_LOC_AMP_INFO;
-               hci_send_cmd(hdev, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
+               goto done;
        }
 
-       hci_dev_put(hdev);
+       mgr->state = READ_LOC_AMP_INFO;
+       hci_send_cmd(hdev, HCI_OP_READ_LOCAL_AMP_INFO, 0, NULL);
+
+done:
+       if (hdev)
+               hci_dev_put(hdev);
 
        skb_pull(skb, sizeof(*req));
        return 0;