linux/drivers/regulator
Vladimir Zapolskiy afa16b50e2 regulator: fix memory leak on error path of regulator_register()
[ Upstream commit 9177514ce3 ]

The change corrects registration and deregistration on error path
of a regulator, the problem was manifested by a reported memory
leak on deferred probe:

    as3722-regulator as3722-regulator: regulator 13 register failed -517

    # cat /sys/kernel/debug/kmemleak
    unreferenced object 0xecc43740 (size 64):
      comm "swapper/0", pid 1, jiffies 4294937640 (age 712.880s)
      hex dump (first 32 bytes):
        72 65 67 75 6c 61 74 6f 72 2e 32 34 00 5a 5a 5a  regulator.24.ZZZ
        5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a  ZZZZZZZZZZZZZZZZ
      backtrace:
        [<0c4c3d1c>] __kmalloc_track_caller+0x15c/0x2c0
        [<40c0ad48>] kvasprintf+0x64/0xd4
        [<109abd29>] kvasprintf_const+0x70/0x84
        [<c4215946>] kobject_set_name_vargs+0x34/0xa8
        [<62282ea2>] dev_set_name+0x40/0x64
        [<a39b6757>] regulator_register+0x3a4/0x1344
        [<16a9543f>] devm_regulator_register+0x4c/0x84
        [<51a4c6a1>] as3722_regulator_probe+0x294/0x754
        ...

The memory leak problem was introduced as a side ef another fix in
regulator_register() error path, I believe that the proper fix is
to decouple device_register() function into its two compounds and
initialize a struct device before assigning any values to its fields
and then using it before actual registration of a device happens.

This lets to call put_device() safely after initialization, and, since
now a release callback is called, kfree(rdev->constraints) shall be
removed to exclude a double free condition.

Fixes: a3cde9534e ("regulator: core: fix regulator_register() error paths to properly release rdev")
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
Cc: Wen Yang <wenyang@linux.alibaba.com>
Link: https://lore.kernel.org/r/20200724005013.23278-1-vz@mleia.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2020-08-19 08:15:57 +02:00
..
88pg86x.c
88pm800-regulator.c
88pm8607.c
Kconfig
Makefile
aat2870-regulator.c
ab3100.c
ab8500-ext.c
ab8500.c regulator: ab8500: Remove AB8505 USB regulator 2020-01-09 10:20:04 +01:00
act8865-regulator.c
act8945a-regulator.c
ad5398.c
anatop-regulator.c
arizona-ldo1.c
arizona-micsupp.c
as3711-regulator.c
as3722-regulator.c
axp20x-regulator.c regulator: axp20x: Fix AXP22x ELDO2 regulator enable bitmask 2020-01-09 10:20:04 +01:00
bcm590xx-regulator.c
bd718x7-regulator.c
bd9571mwv-regulator.c
bd70528-regulator.c regulator: bd70528: Add MODULE_ALIAS to allow module auto loading 2020-01-26 10:01:05 +01:00
core.c regulator: fix memory leak on error path of regulator_register() 2020-08-19 08:15:57 +02:00
cpcap-regulator.c
da903x.c
da9052-regulator.c
da9055-regulator.c
da9062-regulator.c
da9063-regulator.c
da9210-regulator.c
da9210-regulator.h
da9211-regulator.c
da9211-regulator.h
db8500-prcmu.c
dbx500-prcmu.c
dbx500-prcmu.h
devres.c
dummy.c
dummy.h
fan53555.c
fixed-helper.c
fixed.c
gpio-regulator.c
helpers.c regulator: core: Add regulator_is_equal() helper 2020-02-11 04:35:48 -08:00
hi655x-regulator.c
hi6421-regulator.c
hi6421v530-regulator.c
internal.h
isl6271a-regulator.c
isl9305.c
lm363x-regulator.c
lochnagar-regulator.c
lp872x.c
lp873x-regulator.c
lp3971.c
lp3972.c
lp8755.c
lp8788-buck.c
lp8788-ldo.c
lp87565-regulator.c
ltc3589.c
ltc3676.c
max1586.c
max8649.c
max8660.c
max8907-regulator.c
max8925-regulator.c
max8952.c
max8973-regulator.c
max8997-regulator.c
max8998.c
max14577-regulator.c
max77620-regulator.c
max77650-regulator.c
max77686-regulator.c
max77693-regulator.c
max77802-regulator.c
mc13xxx-regulator-core.c
mc13xxx.h
mc13783-regulator.c
mc13892-regulator.c
mcp16502.c
mt6311-regulator.c
mt6311-regulator.h
mt6323-regulator.c
mt6358-regulator.c
mt6380-regulator.c
mt6397-regulator.c
of_regulator.c
palmas-regulator.c
pbias-regulator.c
pcap-regulator.c
pcf50633-regulator.c
pfuze100-regulator.c regualtor: pfuze100: correct sw1a/sw2 on pfuze3000 2020-06-30 15:36:54 -04:00
pv88060-regulator.c
pv88060-regulator.h
pv88080-regulator.c
pv88080-regulator.h
pv88090-regulator.c
pv88090-regulator.h
pwm-regulator.c
qcom-rpmh-regulator.c regulator: qcom-rpmh: Fix typos in pm8150 and pm8150l 2020-06-22 09:30:58 +02:00
qcom_rpm-regulator.c
qcom_smd-regulator.c
qcom_spmi-regulator.c
rc5t583-regulator.c
rk808-regulator.c regulator: rk808: Lower log level on optional GPIOs being not available 2020-02-24 08:36:33 +01:00
rn5t618-regulator.c regulator: rn5t618: fix module aliases 2020-01-12 12:21:34 +01:00
rt5033-regulator.c
s2mpa01.c
s2mps11.c
s5m8767.c
sc2731-regulator.c
sky81452-regulator.c
slg51000-regulator.c
slg51000-regulator.h
stm32-booster.c
stm32-pwr.c
stm32-vrefbuf.c regulator: stm32-vrefbuf: fix a possible overshoot when re-enabling 2020-03-12 13:00:29 +01:00
stpmic1_regulator.c
stw481x-vmmc.c
sy8106a-regulator.c
sy8824x.c
ti-abb-regulator.c
tps6105x-regulator.c
tps6507x-regulator.c
tps6524x-regulator.c
tps6586x-regulator.c
tps51632-regulator.c
tps62360-regulator.c
tps65023-regulator.c
tps65086-regulator.c
tps65090-regulator.c
tps65132-regulator.c
tps65217-regulator.c
tps65218-regulator.c
tps65910-regulator.c
tps65912-regulator.c
tps80031-regulator.c
twl-regulator.c
twl6030-regulator.c
uniphier-regulator.c
userspace-consumer.c
vctrl-regulator.c regulator: vctrl-regulator: Avoid deadlock getting and setting the voltage 2020-02-24 08:36:52 +01:00
vexpress-regulator.c
virtual.c
wm831x-dcdc.c
wm831x-isink.c
wm831x-ldo.c
wm8350-regulator.c
wm8400-regulator.c
wm8994-regulator.c