net: atm: fix memory leak in atm_register_sysfs when device_register fail
When device_register() return error in atm_register_sysfs(), which can be
triggered by kzalloc fail in device_private_init() or other reasons,
kmemleak reports the following memory leaks:
unreferenced object 0xffff88810182fb80 (size 8):
comm "insmod", pid 504, jiffies 4294852464
hex dump (first 8 bytes):
61 64 75 6d 6d 79 30 00 adummy0.
backtrace (crc 14dfadaf):
__kmalloc_node_track_caller_noprof+0x335/0x450
kvasprintf+0xb3/0x130
kobject_set_name_vargs+0x45/0x120
dev_set_name+0xa9/0xe0
atm_register_sysfs+0xf3/0x220
atm_dev_register+0x40b/0x780
0xffffffffa000b089
do_one_initcall+0x89/0x300
do_init_module+0x27b/0x7d0
load_module+0x54cd/0x5ff0
init_module_from_file+0xe4/0x150
idempotent_init_module+0x32c/0x610
__x64_sys_finit_module+0xbd/0x120
do_syscall_64+0xa8/0x270
entry_SYSCALL_64_after_hwframe+0x77/0x7f
When device_create_file() return error in atm_register_sysfs(), the same
issue also can be triggered.
Function put_device() should be called to release kobj->name memory and
other device resource, instead of kfree().
Fixes: 1fa5ae857b
("driver core: get rid of struct device's bus_id string array")
Signed-off-by: Wang Liang <wangliang74@huawei.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250901063537.1472221-1-wangliang74@huawei.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
8156210d36
commit
0a228624bc
|
@ -112,7 +112,9 @@ struct atm_dev *atm_dev_register(const char *type, struct device *parent,
|
||||||
|
|
||||||
if (atm_proc_dev_register(dev) < 0) {
|
if (atm_proc_dev_register(dev) < 0) {
|
||||||
pr_err("atm_proc_dev_register failed for dev %s\n", type);
|
pr_err("atm_proc_dev_register failed for dev %s\n", type);
|
||||||
goto out_fail;
|
mutex_unlock(&atm_dev_mutex);
|
||||||
|
kfree(dev);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atm_register_sysfs(dev, parent) < 0) {
|
if (atm_register_sysfs(dev, parent) < 0) {
|
||||||
|
@ -128,7 +130,7 @@ out:
|
||||||
return dev;
|
return dev;
|
||||||
|
|
||||||
out_fail:
|
out_fail:
|
||||||
kfree(dev);
|
put_device(&dev->class_dev);
|
||||||
dev = NULL;
|
dev = NULL;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue