Skip to content

Commit 5f4b204

Browse files
henryZebroonie
authored andcommitted
regulator: core: fix kobject release warning and memory leak in regulator_register()
Here is a warning report about lack of registered release() from kobject lib: Device '(null)' does not have a release() function, it is broken and must be fixed. WARNING: CPU: 0 PID: 48430 at drivers/base/core.c:2332 device_release+0x104/0x120 Call Trace: kobject_put+0xdc/0x180 put_device+0x1b/0x30 regulator_register+0x651/0x1170 devm_regulator_register+0x4f/0xb0 When regulator_register() returns fail and directly goto `clean` symbol, rdev->dev has not registered release() function yet (which is registered by regulator_class in the following), so rdev needs to be freed manually. If rdev->dev.of_node is not NULL, which means the of_node has gotten by regulator_of_get_init_data(), it needs to call of_node_put() to avoid refcount leak. Otherwise, only calling put_device() would lead memory leak of rdev in further: unreferenced object 0xffff88810d0b1000 (size 2048): comm "107-i2c-rtq6752", pid 48430, jiffies 4342258431 (age 1341.780s) backtrace: kmalloc_trace+0x22/0x110 regulator_register+0x184/0x1170 devm_regulator_register+0x4f/0xb0 When regulator_register() returns fail and goto `wash` symbol, rdev->dev has registered release() function, so directly call put_device() to cleanup everything. Fixes: d3c7315 ("regulator: plug of_node leak in regulator_register()'s error path") Signed-off-by: Zeng Heng <zengheng4@huawei.com> Link: https://lore.kernel.org/r/20221116074339.1024240-1-zengheng4@huawei.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 392cc0a commit 5f4b204

1 file changed

Lines changed: 5 additions & 1 deletion

File tree

drivers/regulator/core.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5639,11 +5639,15 @@ regulator_register(const struct regulator_desc *regulator_desc,
56395639
mutex_lock(&regulator_list_mutex);
56405640
regulator_ena_gpio_free(rdev);
56415641
mutex_unlock(&regulator_list_mutex);
5642+
put_device(&rdev->dev);
5643+
rdev = NULL;
56425644
clean:
56435645
if (dangling_of_gpiod)
56445646
gpiod_put(config->ena_gpiod);
5647+
if (rdev && rdev->dev.of_node)
5648+
of_node_put(rdev->dev.of_node);
5649+
kfree(rdev);
56455650
kfree(config);
5646-
put_device(&rdev->dev);
56475651
rinse:
56485652
if (dangling_cfg_gpiod)
56495653
gpiod_put(cfg->ena_gpiod);

0 commit comments

Comments
 (0)