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

Commit 1a6958e7 authored by Axel Lin's avatar Axel Lin Committed by Liam Girdwood
Browse files

regulator: Fix memory leak in set_machine_constraints() error paths



Properly kfree rdev->constraints in all set_machine_constraints() error paths.
Also properly kfree rdev->constraints in regulator_register() error paths.

Signed-off-by: default avatarAxel Lin <axel.lin@gmail.com>
Acked-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
parent 89f425ed
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -794,7 +794,6 @@ static int machine_constraints_voltage(struct regulator_dev *rdev,
		if (ret < 0) {
			rdev_err(rdev, "failed to apply %duV constraint\n",
				 rdev->constraints->min_uV);
			rdev->constraints = NULL;
			return ret;
		}
	}
@@ -897,7 +896,6 @@ static int set_machine_constraints(struct regulator_dev *rdev,
		ret = suspend_prepare(rdev, rdev->constraints->initial_state);
		if (ret < 0) {
			rdev_err(rdev, "failed to set suspend state\n");
			rdev->constraints = NULL;
			goto out;
		}
	}
@@ -924,13 +922,15 @@ static int set_machine_constraints(struct regulator_dev *rdev,
		ret = ops->enable(rdev);
		if (ret < 0) {
			rdev_err(rdev, "failed to enable\n");
			rdev->constraints = NULL;
			goto out;
		}
	}

	print_constraints(rdev);
	return 0;
out:
	kfree(rdev->constraints);
	rdev->constraints = NULL;
	return ret;
}

@@ -2701,6 +2701,7 @@ unset_supplies:
	unset_regulator_supplies(rdev);

scrub:
	kfree(rdev->constraints);
	device_unregister(&rdev->dev);
	/* device core frees rdev */
	rdev = ERR_PTR(ret);