| From 39b5005431c5abedee2ee97e6083bea8e5c1cf98 Mon Sep 17 00:00:00 2001 |
| From: Felipe Pena <felipensp@gmail.com> |
| Date: Mon, 7 Oct 2013 23:25:44 -0300 |
| Subject: clk/zynq: Fix possible memory leak |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| The zynq_clk_register_fclk function can leak memory (fclk_lock) when unable |
| to alloc memory for fclk_gate_lock |
| |
| Signed-off-by: Felipe Pena <felipensp@gmail.com> |
| Acked-by: Sรถren Brinkmann <soren.brinkmann@xilinx.com> |
| Signed-off-by: Mike Turquette <mturquette@linaro.org> |
| (cherry picked from commit f8fe36f6083a70270a7305f7740b124ff1e8aea7) |
| Signed-off-by: Daniel Sangorrin <daniel.sangorrin@toshiba.co.jp> |
| Signed-off-by: Yoshitake Kobayashi <yoshitake.kobayashi@toshiba.co.jp> |
| --- |
| drivers/clk/zynq/clkc.c | 16 +++++++++++++++- |
| 1 file changed, 15 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/clk/zynq/clkc.c b/drivers/clk/zynq/clkc.c |
| index cc40fe64f2dc..10772aa72e4e 100644 |
| --- a/drivers/clk/zynq/clkc.c |
| +++ b/drivers/clk/zynq/clkc.c |
| @@ -117,13 +117,19 @@ static void __init zynq_clk_register_fclk(enum zynq_clk fclk, |
| goto err; |
| fclk_gate_lock = kmalloc(sizeof(*fclk_gate_lock), GFP_KERNEL); |
| if (!fclk_gate_lock) |
| - goto err; |
| + goto err_fclk_gate_lock; |
| spin_lock_init(fclk_lock); |
| spin_lock_init(fclk_gate_lock); |
| |
| mux_name = kasprintf(GFP_KERNEL, "%s_mux", clk_name); |
| + if (!mux_name) |
| + goto err_mux_name; |
| div0_name = kasprintf(GFP_KERNEL, "%s_div0", clk_name); |
| + if (!div0_name) |
| + goto err_div0_name; |
| div1_name = kasprintf(GFP_KERNEL, "%s_div1", clk_name); |
| + if (!div1_name) |
| + goto err_div1_name; |
| |
| clk = clk_register_mux(NULL, mux_name, parents, 4, |
| CLK_SET_RATE_NO_REPARENT, fclk_ctrl_reg, 4, 2, 0, |
| @@ -147,6 +153,14 @@ static void __init zynq_clk_register_fclk(enum zynq_clk fclk, |
| |
| return; |
| |
| +err_div1_name: |
| + kfree(div0_name); |
| +err_div0_name: |
| + kfree(mux_name); |
| +err_mux_name: |
| + kfree(fclk_gate_lock); |
| +err_fclk_gate_lock: |
| + kfree(fclk_lock); |
| err: |
| clks[fclk] = ERR_PTR(-ENOMEM); |
| } |
| -- |
| 1.8.5.rc3 |
| |