drivers: dio: fix possible memory leak in dio_init()
[ Upstream commit e63e99397b2613d50a5f4f02ed07307e67a190f1 ] If device_register() returns error, the 'dev' and name needs be freed. Add a release function, and then call put_device() in the error path, so the name is freed in kobject_cleanup() and to the 'dev' is freed in release function. Fixes:2e4c77bea3
("m68k: dio - Kill warn_unused_result warnings") Fixes:1fa5ae857b
("driver core: get rid of struct device's bus_id string array") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Link: https://lore.kernel.org/r/20221109064036.1835346-1-yangyingliang@huawei.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
d4bf3fcccd
commit
da64e01da4
@ -110,6 +110,12 @@ static char dio_no_name[] = { 0 };
|
|||||||
|
|
||||||
#endif /* CONFIG_DIO_CONSTANTS */
|
#endif /* CONFIG_DIO_CONSTANTS */
|
||||||
|
|
||||||
|
static void dio_dev_release(struct device *dev)
|
||||||
|
{
|
||||||
|
struct dio_dev *ddev = container_of(dev, typeof(struct dio_dev), dev);
|
||||||
|
kfree(ddev);
|
||||||
|
}
|
||||||
|
|
||||||
int __init dio_find(int deviceid)
|
int __init dio_find(int deviceid)
|
||||||
{
|
{
|
||||||
/* Called to find a DIO device before the full bus scan has run.
|
/* Called to find a DIO device before the full bus scan has run.
|
||||||
@ -222,6 +228,7 @@ static int __init dio_init(void)
|
|||||||
dev->bus = &dio_bus;
|
dev->bus = &dio_bus;
|
||||||
dev->dev.parent = &dio_bus.dev;
|
dev->dev.parent = &dio_bus.dev;
|
||||||
dev->dev.bus = &dio_bus_type;
|
dev->dev.bus = &dio_bus_type;
|
||||||
|
dev->dev.release = dio_dev_release;
|
||||||
dev->scode = scode;
|
dev->scode = scode;
|
||||||
dev->resource.start = pa;
|
dev->resource.start = pa;
|
||||||
dev->resource.end = pa + DIO_SIZE(scode, va);
|
dev->resource.end = pa + DIO_SIZE(scode, va);
|
||||||
@ -249,6 +256,7 @@ static int __init dio_init(void)
|
|||||||
if (error) {
|
if (error) {
|
||||||
pr_err("DIO: Error registering device %s\n",
|
pr_err("DIO: Error registering device %s\n",
|
||||||
dev->name);
|
dev->name);
|
||||||
|
put_device(&dev->dev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
error = dio_create_sysfs_dev_files(dev);
|
error = dio_create_sysfs_dev_files(dev);
|
||||||
|
Loading…
Reference in New Issue
Block a user