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>
Sat, 31 Dec 2022 12:14:27 +0000 (13:14 +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 4c06c93c93d32f59f04d45001e23b21861d3116b..c7f7134adc21d130c8aba0cc76f2ce9547d6868b 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.
@@ -224,6 +230,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);
@@ -251,6 +258,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);