• Vladimir Zapolskiy's avatar
    regulator: fix memory leak on error path of regulator_register() · 9177514c
    Vladimir Zapolskiy authored
    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: a3cde953 ("regulator: core: fix regulator_register() error paths to properly release rdev")
    Signed-off-by: default avatarVladimir Zapolskiy <vz@mleia.com>
    Cc: Wen Yang <wenyang@linux.alibaba.com>
    Link: https://lore.kernel.org/r/20200724005013.23278-1-vz@mleia.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    9177514c
core.c 150 KB