diff options
author | Nishka Dasgupta <nishkadg.linux@gmail.com> | 2019-07-16 11:13:30 +0530 |
---|---|---|
committer | Rob Herring <robh@kernel.org> | 2019-08-12 16:52:24 -0600 |
commit | 60d437bbff358748fcfc3bce5f08da9a6b3761da (patch) | |
tree | 86e041bbc1d6e293362e2b7b970df86de7af7cfc /drivers | |
parent | 740ce365a4dccc1df4d05219cd5bf68f01359196 (diff) | |
download | linux-60d437bbff358748fcfc3bce5f08da9a6b3761da.tar.gz linux-60d437bbff358748fcfc3bce5f08da9a6b3761da.tar.bz2 linux-60d437bbff358748fcfc3bce5f08da9a6b3761da.zip |
of: resolver: Add of_node_put() before return and break
Each iteration of for_each_child_of_node puts the previous node, but in
the case of a return or break from the middle of the loop, there is no
put, thus causing a memory leak. Hence add an of_node_put before the
return or break in three places.
Issue found with Coccinelle.
Signed-off-by: Nishka Dasgupta <nishkadg.linux@gmail.com>
Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/of/resolver.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c index c1b67dd7cd6e..83c766233181 100644 --- a/drivers/of/resolver.c +++ b/drivers/of/resolver.c @@ -206,16 +206,22 @@ static int adjust_local_phandle_references(struct device_node *local_fixups, for_each_child_of_node(local_fixups, child) { for_each_child_of_node(overlay, overlay_child) - if (!node_name_cmp(child, overlay_child)) + if (!node_name_cmp(child, overlay_child)) { + of_node_put(overlay_child); break; + } - if (!overlay_child) + if (!overlay_child) { + of_node_put(child); return -EINVAL; + } err = adjust_local_phandle_references(child, overlay_child, phandle_delta); - if (err) + if (err) { + of_node_put(child); return err; + } } return 0; |