clk/zynq: Fix possible memory leak
authorFelipe Pena <felipensp@gmail.com>
Tue, 8 Oct 2013 02:25:44 +0000 (23:25 -0300)
committerMike Turquette <mturquette@linaro.org>
Tue, 8 Oct 2013 05:43:27 +0000 (22:43 -0700)
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>
drivers/clk/zynq/clkc.c

index cc40fe64f2dc681c44205151537a71222e8d4990..10772aa72e4e662e678688cac3225a85f41bb4e4 100644 (file)
@@ -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;
        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);
        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);
        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);
        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,
 
        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;
 
 
        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);
 }
 err:
        clks[fclk] = ERR_PTR(-ENOMEM);
 }
This page took 0.025514 seconds and 5 git commands to generate.