lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 15 Jul 2015 10:38:38 +0200 From: Javier Martinez Canillas <javier@....samsung.com> To: Krzysztof Kozlowski <k.kozlowski@...sung.com> Cc: Mark Brown <broonie@...nel.org>, Liam Girdwood <lgirdwood@...il.com>, linux-kernel@...r.kernel.org Subject: Re: [PATCH] regulator: core: Fix memory leak in regulator_resolve_supply() 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@....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@....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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists