| From ac37c308d2b671d5cfd233996d81c84c12c4fb51 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 23 Apr 2021 09:02:26 +0200 |
| Subject: clk: mvebu: ap-cpu-clk: Fix a memory leak in error handling paths |
| |
| From: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| |
| [ Upstream commit af9617b419f77cf0b99702a7b2b0519da0d27715 ] |
| |
| If we exit the for_each_of_cpu_node loop early, the reference on the |
| current node must be decremented, otherwise there is a leak. |
| |
| Fixes: f756e362d938 ("clk: mvebu: add CPU clock driver for Armada 7K/8K") |
| Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> |
| Link: https://lore.kernel.org/r/545df946044fc1fc05a4217cdf0054be7a79e49e.1619161112.git.christophe.jaillet@wanadoo.fr |
| Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Stephen Boyd <sboyd@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/clk/mvebu/ap-cpu-clk.c | 14 +++++++++++--- |
| 1 file changed, 11 insertions(+), 3 deletions(-) |
| |
| diff --git a/drivers/clk/mvebu/ap-cpu-clk.c b/drivers/clk/mvebu/ap-cpu-clk.c |
| index af5e5acad3706..bde4a7d6a1d33 100644 |
| --- a/drivers/clk/mvebu/ap-cpu-clk.c |
| +++ b/drivers/clk/mvebu/ap-cpu-clk.c |
| @@ -256,12 +256,15 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
| int cpu, err; |
| |
| err = of_property_read_u32(dn, "reg", &cpu); |
| - if (WARN_ON(err)) |
| + if (WARN_ON(err)) { |
| + of_node_put(dn); |
| return err; |
| + } |
| |
| /* If cpu2 or cpu3 is enabled */ |
| if (cpu & APN806_CLUSTER_NUM_MASK) { |
| nclusters = 2; |
| + of_node_put(dn); |
| break; |
| } |
| } |
| @@ -288,8 +291,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
| int cpu, err; |
| |
| err = of_property_read_u32(dn, "reg", &cpu); |
| - if (WARN_ON(err)) |
| + if (WARN_ON(err)) { |
| + of_node_put(dn); |
| return err; |
| + } |
| |
| cluster_index = cpu & APN806_CLUSTER_NUM_MASK; |
| cluster_index >>= APN806_CLUSTER_NUM_OFFSET; |
| @@ -301,6 +306,7 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
| parent = of_clk_get(np, cluster_index); |
| if (IS_ERR(parent)) { |
| dev_err(dev, "Could not get the clock parent\n"); |
| + of_node_put(dn); |
| return -EINVAL; |
| } |
| parent_name = __clk_get_name(parent); |
| @@ -319,8 +325,10 @@ static int ap_cpu_clock_probe(struct platform_device *pdev) |
| init.parent_names = &parent_name; |
| |
| ret = devm_clk_hw_register(dev, &ap_cpu_clk[cluster_index].hw); |
| - if (ret) |
| + if (ret) { |
| + of_node_put(dn); |
| return ret; |
| + } |
| ap_cpu_data->hws[cluster_index] = &ap_cpu_clk[cluster_index].hw; |
| } |
| |
| -- |
| 2.33.0 |
| |