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

Commit d27580c1 authored by Christophe JAILLET's avatar Christophe JAILLET Committed by Greg Kroah-Hartman
Browse files

clk: mvebu: ap-cpu-clk: Fix a memory leak in error handling paths



[ 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: f756e362 ("clk: mvebu: add CPU clock driver for Armada 7K/8K")
Signed-off-by: default avatarChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Link: https://lore.kernel.org/r/545df946044fc1fc05a4217cdf0054be7a79e49e.1619161112.git.christophe.jaillet@wanadoo.fr


Reviewed-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarStephen Boyd <sboyd@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 9212ebb1
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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;
	}