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 initialized device.

Change-Id: Icbd88e9ccd42fedb4fbce5eff69248c3fceffc02
Signed-off-by: David Dai <daidavid1@codeaurora.org>
Signed-off-by: Srinivasarao P <spathi@codeaurora.org>
This commit is contained in:
David Dai 2018-03-22 17:00:57 -07:00 committed by syphyr
parent f30dbf425a
commit dfc2fac0fb
1 changed files with 18 additions and 30 deletions

View File

@ -944,10 +944,8 @@ static struct device *msm_bus_device_init(
bus_node = kzalloc(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;
}
bus_dev = &bus_node->dev;
device_initialize(bus_dev);
@ -955,47 +953,37 @@ static struct device *msm_bus_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->of_node = pdata->of_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;
}
device_create_file(bus_dev, &dev_attr_bw);
INIT_LIST_HEAD(&bus_node->devlist);
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)
@ -1142,10 +1130,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;
}