Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 36a1f1b6 authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Mark Brown
Browse files

regulator: core: Fix memory leak in regulator_resolve_supply()



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: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent e2c09ae7
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -109,6 +109,7 @@ static int _regulator_do_set_voltage(struct regulator_dev *rdev,
static struct regulator *create_regulator(struct regulator_dev *rdev,
static struct regulator *create_regulator(struct regulator_dev *rdev,
					  struct device *dev,
					  struct device *dev,
					  const char *supply_name);
					  const char *supply_name);
static void _regulator_put(struct regulator *regulator);


static const char *rdev_get_name(struct regulator_dev *rdev)
static const char *rdev_get_name(struct regulator_dev *rdev)
{
{
@@ -1401,9 +1402,12 @@ static int regulator_resolve_supply(struct regulator_dev *rdev)
	/* Cascade always-on state to supply */
	/* Cascade always-on state to supply */
	if (_regulator_is_enabled(rdev)) {
	if (_regulator_is_enabled(rdev)) {
		ret = regulator_enable(rdev->supply);
		ret = regulator_enable(rdev->supply);
		if (ret < 0)
		if (ret < 0) {
			if (rdev->supply)
				_regulator_put(rdev->supply);
			return ret;
			return ret;
		}
		}
	}


	return 0;
	return 0;
}
}