regulator: clear state each invocation of of_regulator_match
of_regulator_match() saves some dynamcially allocated state into the match table that's passed to it. By implementation and not contract, for each match table entry, if non-NULL state is already present, of_regulator_match() will not overwrite it. of_regulator_match() is typically called each time a regulator is probe()d. This means it is called with the same match table over and over again if a regulator triggers deferred probe. This results in stale, kfree()d data being left in the match table from probe to probe, which causes a variety of crashes or use of invalid data. Explicitly free all output state from of_regulator_match() before generating new results in order to avoid this. Signed-off-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com> Cc: stable@vger.kernel.org
This commit is contained in:
parent
949db153b6
commit
a2f95c3637
|
@ -120,6 +120,12 @@ int of_regulator_match(struct device *dev, struct device_node *node,
|
|||
if (!dev || !node)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < num_matches; i++) {
|
||||
struct of_regulator_match *match = &matches[i];
|
||||
match->init_data = NULL;
|
||||
match->of_node = NULL;
|
||||
}
|
||||
|
||||
for_each_child_of_node(node, child) {
|
||||
name = of_get_property(child,
|
||||
"regulator-compatible", NULL);
|
||||
|
|
Loading…
Reference in a new issue