Messages in this thread | ![/](/images/icornerl.gif) | | Subject | Re: [PATCH] regulator: core: Fix memory leak in regulator_resolve_supply() | From | Javier Martinez Canillas <> | Date | Wed, 15 Jul 2015 10:38:38 +0200 |
| |
Hello Krzysztof,
Thanks a lot for your feedback.
On 07/15/2015 10:01 AM, Krzysztof Kozlowski wrote: > 2015-07-14 23:21 GMT+09:00 Javier Martinez Canillas <javier@osg.samsung.com>: >> The regulator_resolve_supply() function calls set_supply() which in turn >> calls create_regulator() to allocate a supply regulator. >> >> If an error occurs after set_supply() succeeded, the allocated regulator >> has to be freed before propagating the error code. >> >> Signed-off-by: Javier Martinez Canillas <javier@osg.samsung.com> >> >> --- >> >> drivers/regulator/core.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c >> index 68b616580533..325c0f5c13ca 100644 >> --- a/drivers/regulator/core.c >> +++ b/drivers/regulator/core.c >> @@ -109,6 +109,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev, >> static struct regulator *create_regulator(struct regulator_dev *rdev, >> struct device *dev, >> const char *supply_name); >> +static void _regulator_put(struct regulator *regulator); >> >> static const char *rdev_get_name(struct regulator_dev *rdev) >> { >> @@ -1402,8 +1403,11 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) >> /* Cascade always-on state to supply */ >> if (_regulator_is_enabled(rdev)) { >> ret = regulator_enable(rdev->supply); >> - if (ret < 0) >> + if (ret < 0) { >> + if (rdev->supply) >> + _regulator_put(rdev->supply); > > The _regulator_put() reverts more work than create_regulator() did, > e.g.: module_put and rdev->open_count--. Maybe you need a > destroy_regulator() function? >
Yes, it reverts more work than create_regulator() but the intention is to revert what set_supply() did. If you look at the set_supply() function, it does supply_rdev->open_count++.
I did indeed missed the module_put() but now looking at the code again, I wonder if the problem is not that set_supply() is missing a try_module_get() to be consistent with what the _regulator_get() function does.
> Best regards, > Krzysztof >
Best regards, -- Javier Martinez Canillas Open Source Group Samsung Research America
| ![\](/images/icornerr.gif) |