diff options
author | Dan Carpenter <dan.carpenter@linaro.org> | 2023-09-08 09:03:50 +0200 |
---|---|---|
committer | Rob Herring <robh@kernel.org> | 2023-09-11 16:58:54 +0200 |
commit | 55e95bfccf6db8d26a66c46e1de50d53c59a6774 (patch) | |
tree | 6508582074d0f776c169a3391f8b87091c198b13 /drivers/of/dynamic.c | |
parent | Linux 6.6-rc1 (diff) | |
download | linux-55e95bfccf6db8d26a66c46e1de50d53c59a6774.tar.xz linux-55e95bfccf6db8d26a66c46e1de50d53c59a6774.zip |
of: dynamic: Fix potential memory leak in of_changeset_action()
Smatch complains that the error path where "action" is invalid leaks
the "ce" allocation:
drivers/of/dynamic.c:935 of_changeset_action()
warn: possible memory leak of 'ce'
Fix this by doing the validation before the allocation.
Note that there is not any actual problem with upstream kernels. All
callers of of_changeset_action() are static inlines with fixed action
values.
Fixes: 914d9d831e61 ("of: dynamic: Refactor action prints to not use "%pOF" inside devtree_lock")
Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/r/202309011059.EOdr4im9-lkp@intel.com/
Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/7dfaf999-30ad-491c-9615-fb1138db121c@moroto.mountain
Signed-off-by: Rob Herring <robh@kernel.org>
Diffstat (limited to 'drivers/of/dynamic.c')
-rw-r--r-- | drivers/of/dynamic.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/of/dynamic.c b/drivers/of/dynamic.c index 0a3483e247a8..f63250c650ca 100644 --- a/drivers/of/dynamic.c +++ b/drivers/of/dynamic.c @@ -890,13 +890,13 @@ int of_changeset_action(struct of_changeset *ocs, unsigned long action, { struct of_changeset_entry *ce; + if (WARN_ON(action >= ARRAY_SIZE(action_names))) + return -EINVAL; + ce = kzalloc(sizeof(*ce), GFP_KERNEL); if (!ce) return -ENOMEM; - if (WARN_ON(action >= ARRAY_SIZE(action_names))) - return -EINVAL; - /* get a reference to the node */ ce->action = action; ce->np = of_node_get(np); |