lkml.org 
[lkml]   [2021]   [Jan]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 34/47] rtc: sun6i: Fix memleak in sun6i_rtc_clk_init
    Date
    From: Dinghao Liu <dinghao.liu@zju.edu.cn>

    [ Upstream commit 28d211919e422f58c1e6c900e5810eee4f1ce4c8 ]

    When clk_hw_register_fixed_rate_with_accuracy() fails,
    clk_data should be freed. It's the same for the subsequent
    two error paths, but we should also unregister the already
    registered clocks in them.

    Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
    Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
    Link: https://lore.kernel.org/r/20201020061226.6572-1-dinghao.liu@zju.edu.cn
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/rtc/rtc-sun6i.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
    index fc32be687606c..c41bc8084d7cc 100644
    --- a/drivers/rtc/rtc-sun6i.c
    +++ b/drivers/rtc/rtc-sun6i.c
    @@ -276,7 +276,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
    300000000);
    if (IS_ERR(rtc->int_osc)) {
    pr_crit("Couldn't register the internal oscillator\n");
    - return;
    + goto err;
    }

    parents[0] = clk_hw_get_name(rtc->int_osc);
    @@ -292,7 +292,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
    rtc->losc = clk_register(NULL, &rtc->hw);
    if (IS_ERR(rtc->losc)) {
    pr_crit("Couldn't register the LOSC clock\n");
    - return;
    + goto err_register;
    }

    of_property_read_string_index(node, "clock-output-names", 1,
    @@ -303,7 +303,7 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
    &rtc->lock);
    if (IS_ERR(rtc->ext_losc)) {
    pr_crit("Couldn't register the LOSC external gate\n");
    - return;
    + goto err_register;
    }

    clk_data->num = 2;
    @@ -316,6 +316,8 @@ static void __init sun6i_rtc_clk_init(struct device_node *node,
    of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data);
    return;

    +err_register:
    + clk_hw_unregister_fixed_rate(rtc->int_osc);
    err:
    kfree(clk_data);
    }
    --
    2.27.0


    \
     
     \ /
      Last update: 2021-01-04 17:11    [W:4.118 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site