drivers: dio: fix possible memory leak in dio_init()
authorYang Yingliang <yangyingliang@huawei.com>
Wed, 9 Nov 2022 06:40:36 +0000 (14:40 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 08:26:22 +0000 (09:26 +0100)
[ 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: 2e4c77bea3d8 ("m68k: dio - Kill warn_unused_result warnings")
Fixes: 1fa5ae857bb1 ("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>
drivers/dio/dio.c

index 92e78d16b476550c365baad796e82a50f7ba0191..fcde602f4902091642a83cefe48b41e2ff570750 100644 (file)
@@ -110,6 +110,12 @@ static char dio_no_name[] = { 0 };
 
 #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)
 {
        /* 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->dev.parent = &dio_bus.dev;
                dev->dev.bus = &dio_bus_type;
+               dev->dev.release = dio_dev_release;
                dev->scode = scode;
                dev->resource.start = pa;
                dev->resource.end = pa + DIO_SIZE(scode, va);
@@ -249,6 +256,7 @@ static int __init dio_init(void)
                if (error) {
                        pr_err("DIO: Error registering device %s\n",
                               dev->name);
+                       put_device(&dev->dev);
                        continue;
                }
                error = dio_create_sysfs_dev_files(dev);