Skip to content

Commit 57a6ad4

Browse files
osctobebroonie
authored andcommitted
regulator: fix memory leak with repeated set_machine_constraints()
Fixed commit introduced a possible second call to set_machine_constraints() and that allocates memory for rdev->constraints. Move the allocation to the caller so it's easier to manage and done once. Fixes: aea6cb9 ("regulator: resolve supply after creating regulator") Cc: stable@vger.kernel.org Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Tested-by: Ahmad Fatoum <a.fatoum@pengutronix.de> # stpmic1 Link: https://lore.kernel.org/r/78c3d4016cebc08d441aad18cb924b4e4d9cf9df.1605226675.git.mirq-linux@rere.qmqm.pl Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 365ec8b commit 57a6ad4

File tree

1 file changed

+13
-16
lines changed

1 file changed

+13
-16
lines changed

drivers/regulator/core.c

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,29 +1315,18 @@ static int _regulator_do_enable(struct regulator_dev *rdev);
13151315
/**
13161316
* set_machine_constraints - sets regulator constraints
13171317
* @rdev: regulator source
1318-
* @constraints: constraints to apply
13191318
*
13201319
* Allows platform initialisation code to define and constrain
13211320
* regulator circuits e.g. valid voltage/current ranges, etc. NOTE:
13221321
* Constraints *must* be set by platform code in order for some
13231322
* regulator operations to proceed i.e. set_voltage, set_current_limit,
13241323
* set_mode.
13251324
*/
1326-
static int set_machine_constraints(struct regulator_dev *rdev,
1327-
const struct regulation_constraints *constraints)
1325+
static int set_machine_constraints(struct regulator_dev *rdev)
13281326
{
13291327
int ret = 0;
13301328
const struct regulator_ops *ops = rdev->desc->ops;
13311329

1332-
if (constraints)
1333-
rdev->constraints = kmemdup(constraints, sizeof(*constraints),
1334-
GFP_KERNEL);
1335-
else
1336-
rdev->constraints = kzalloc(sizeof(*constraints),
1337-
GFP_KERNEL);
1338-
if (!rdev->constraints)
1339-
return -ENOMEM;
1340-
13411330
ret = machine_constraints_voltage(rdev, rdev->constraints);
13421331
if (ret != 0)
13431332
return ret;
@@ -5146,7 +5135,6 @@ struct regulator_dev *
51465135
regulator_register(const struct regulator_desc *regulator_desc,
51475136
const struct regulator_config *cfg)
51485137
{
5149-
const struct regulation_constraints *constraints = NULL;
51505138
const struct regulator_init_data *init_data;
51515139
struct regulator_config *config = NULL;
51525140
static atomic_t regulator_no = ATOMIC_INIT(-1);
@@ -5285,14 +5273,23 @@ regulator_register(const struct regulator_desc *regulator_desc,
52855273

52865274
/* set regulator constraints */
52875275
if (init_data)
5288-
constraints = &init_data->constraints;
5276+
rdev->constraints = kmemdup(&init_data->constraints,
5277+
sizeof(*rdev->constraints),
5278+
GFP_KERNEL);
5279+
else
5280+
rdev->constraints = kzalloc(sizeof(*rdev->constraints),
5281+
GFP_KERNEL);
5282+
if (!rdev->constraints) {
5283+
ret = -ENOMEM;
5284+
goto wash;
5285+
}
52895286

52905287
if (init_data && init_data->supply_regulator)
52915288
rdev->supply_name = init_data->supply_regulator;
52925289
else if (regulator_desc->supply_name)
52935290
rdev->supply_name = regulator_desc->supply_name;
52945291

5295-
ret = set_machine_constraints(rdev, constraints);
5292+
ret = set_machine_constraints(rdev);
52965293
if (ret == -EPROBE_DEFER) {
52975294
/* Regulator might be in bypass mode and so needs its supply
52985295
* to set the constraints */
@@ -5301,7 +5298,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
53015298
* that is just being created */
53025299
ret = regulator_resolve_supply(rdev);
53035300
if (!ret)
5304-
ret = set_machine_constraints(rdev, constraints);
5301+
ret = set_machine_constraints(rdev);
53055302
else
53065303
rdev_dbg(rdev, "unable to resolve supply early: %pe\n",
53075304
ERR_PTR(ret));

0 commit comments

Comments
 (0)