diff options
author | David Dai <daidavid1@codeaurora.org> | 2018-03-22 17:00:57 -0700 |
---|---|---|
committer | Shirle Yuen <shirleyshukyee@google.com> | 2018-08-05 16:34:45 -0700 |
commit | 3a9de05edd5fff5e20198071f44c93ab6672dd1d (patch) | |
tree | d0435fcc6289c27d268ed0d14c339746ba5cfaa8 | |
parent | 9083f9f7c2bb394c5cbdd5d056e1fc2bee688d6b (diff) | |
download | qcom-msm8x09-v3.10-3a9de05edd5fff5e20198071f44c93ab6672dd1d.tar.gz |
msm: msm_bus: Fix error handling in msm_bus_device_init.
Correctly free pointers allocated by kzalloc. Remove devm_kfree
in error handling as device associated memory is automatically
freed upon destruction of device. Always use put_device instead
of kfree on the initialized device.
Bug: 111289931
Change-Id: Icbd88e9ccd42fedb4fbce5eff69248c3fceffc02
Signed-off-by: David Dai <daidavid1@codeaurora.org>
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
Signed-off-by: Chetan C R <cravin@codeaurora.org>
(cherry picked from commit 0c5253106f7912f9de7b002e53aeebe8eba44e89)
-rw-r--r-- | drivers/platform/msm/msm_bus/msm_bus_fabric_adhoc.c | 50 |
1 files changed, 19 insertions, 31 deletions
diff --git a/drivers/platform/msm/msm_bus/msm_bus_fabric_adhoc.c b/drivers/platform/msm/msm_bus/msm_bus_fabric_adhoc.c index 759452a2a70..28c4a61d1d6 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_fabric_adhoc.c +++ b/drivers/platform/msm/msm_bus/msm_bus_fabric_adhoc.c @@ -948,7 +948,7 @@ static struct device *msm_bus_device_init( if (!bus_dev) { MSM_BUS_ERR("%s:Device alloc failed\n", __func__); bus_dev = NULL; - goto exit_device_init; + goto err_device_init; } /** * Init here so we can use devm calls @@ -958,54 +958,42 @@ static struct device *msm_bus_device_init( bus_node = devm_kzalloc(bus_dev, sizeof(struct msm_bus_node_device_type), GFP_KERNEL); if (!bus_node) { - MSM_BUS_ERR("%s:Bus node alloc failed\n", __func__); - kfree(bus_dev); - bus_dev = NULL; - goto exit_device_init; + ret = -ENOMEM; + goto err_device_init; } node_info = devm_kzalloc(bus_dev, sizeof(struct msm_bus_node_info_type), GFP_KERNEL); if (!node_info) { - MSM_BUS_ERR("%s:Bus node info alloc failed\n", __func__); - devm_kfree(bus_dev, bus_node); - kfree(bus_dev); - bus_dev = NULL; - goto exit_device_init; + ret = -ENOMEM; + goto err_put_device; } bus_node->node_info = node_info; bus_node->ap_owned = pdata->ap_owned; bus_dev->platform_data = bus_node; - if (msm_bus_copy_node_info(pdata, bus_dev) < 0) { - devm_kfree(bus_dev, bus_node); - devm_kfree(bus_dev, node_info); - kfree(bus_dev); - bus_dev = NULL; - goto exit_device_init; - } + ret = msm_bus_copy_node_info(pdata, bus_dev); + if (ret) + goto err_put_device; bus_dev->bus = &msm_bus_type; dev_set_name(bus_dev, bus_node->node_info->name); ret = device_add(bus_dev); - if (ret < 0) { + if (ret) { MSM_BUS_ERR("%s: Error registering device %d", __func__, pdata->node_info->id); - devm_kfree(bus_dev, bus_node); - devm_kfree(bus_dev, node_info->dev_connections); - devm_kfree(bus_dev, node_info->connections); - devm_kfree(bus_dev, node_info->black_connections); - devm_kfree(bus_dev, node_info->black_listed_connections); - devm_kfree(bus_dev, node_info); - kfree(bus_dev); - bus_dev = NULL; - goto exit_device_init; + goto err_put_device; } - -exit_device_init: return bus_dev; + +err_put_device: + put_device(bus_dev); + bus_dev = NULL; + kfree(bus_node); +err_device_init: + return ERR_PTR(ret); } static int msm_bus_setup_dev_conn(struct device *bus_dev, void *data) @@ -1127,10 +1115,10 @@ static int msm_bus_device_probe(struct platform_device *pdev) node_dev = msm_bus_device_init(&pdata->info[i]); - if (!node_dev) { + if (IS_ERR(node_dev)) { MSM_BUS_ERR("%s: Error during dev init for %d", __func__, pdata->info[i].node_info->id); - ret = -ENXIO; + ret = PTR_ERR(node_dev); goto exit_device_probe; } |