OSDN Git Service

Bluetooth: btqcomsmd: Fix a resource leak in error handling paths in the probe function
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sat, 12 Dec 2020 09:46:58 +0000 (10:46 +0100)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 18 Dec 2020 21:20:21 +0000 (22:20 +0100)
Some resource should be released in the error handling path of the probe
function, as already done in the remove function.

The remove function was fixed in commit 5052de8deff5 ("soc: qcom: smd:
Transition client drivers from smd to rpmsg")

Fixes: 1511cc750c3d ("Bluetooth: Introduce Qualcomm WCNSS SMD based HCI driver")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btqcomsmd.c

index 98d5376..2acb719 100644 (file)
@@ -142,12 +142,16 @@ static int btqcomsmd_probe(struct platform_device *pdev)
 
        btq->cmd_channel = qcom_wcnss_open_channel(wcnss, "APPS_RIVA_BT_CMD",
                                                   btqcomsmd_cmd_callback, btq);
-       if (IS_ERR(btq->cmd_channel))
-               return PTR_ERR(btq->cmd_channel);
+       if (IS_ERR(btq->cmd_channel)) {
+               ret = PTR_ERR(btq->cmd_channel);
+               goto destroy_acl_channel;
+       }
 
        hdev = hci_alloc_dev();
-       if (!hdev)
-               return -ENOMEM;
+       if (!hdev) {
+               ret = -ENOMEM;
+               goto destroy_cmd_channel;
+       }
 
        hci_set_drvdata(hdev, btq);
        btq->hdev = hdev;
@@ -161,14 +165,21 @@ static int btqcomsmd_probe(struct platform_device *pdev)
        hdev->set_bdaddr = qca_set_bdaddr_rome;
 
        ret = hci_register_dev(hdev);
-       if (ret < 0) {
-               hci_free_dev(hdev);
-               return ret;
-       }
+       if (ret < 0)
+               goto hci_free_dev;
 
        platform_set_drvdata(pdev, btq);
 
        return 0;
+
+hci_free_dev:
+       hci_free_dev(hdev);
+destroy_cmd_channel:
+       rpmsg_destroy_ept(btq->cmd_channel);
+destroy_acl_channel:
+       rpmsg_destroy_ept(btq->acl_channel);
+
+       return ret;
 }
 
 static int btqcomsmd_remove(struct platform_device *pdev)