lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 114/180] pinctrl: samsung: Fix device node refcount leaks in Exynos wakeup controller init
    Date
    From: Krzysztof Kozlowski <krzk@kernel.org>

    commit 5c7f48dd14e892e3e920dd6bbbd52df79e1b3b41 upstream.

    In exynos_eint_wkup_init() the for_each_child_of_node() loop is used
    with a break to find a matching child node. Although each iteration of
    for_each_child_of_node puts the previous node, but early exit from loop
    misses it. This leads to leak of device node.

    Cc: <stable@vger.kernel.org>
    Fixes: 43b169db1841 ("pinctrl: add exynos4210 specific extensions for samsung pinctrl driver")
    Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/pinctrl/samsung/pinctrl-exynos.c | 10 ++++++++--
    1 file changed, 8 insertions(+), 2 deletions(-)

    --- a/drivers/pinctrl/samsung/pinctrl-exynos.c
    +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c
    @@ -506,6 +506,7 @@ int exynos_eint_wkup_init(struct samsung
    bank->nr_pins, &exynos_eint_irqd_ops, bank);
    if (!bank->irq_domain) {
    dev_err(dev, "wkup irq domain add failed\n");
    + of_node_put(wkup_np);
    return -ENXIO;
    }

    @@ -520,8 +521,10 @@ int exynos_eint_wkup_init(struct samsung
    weint_data = devm_kcalloc(dev,
    bank->nr_pins, sizeof(*weint_data),
    GFP_KERNEL);
    - if (!weint_data)
    + if (!weint_data) {
    + of_node_put(wkup_np);
    return -ENOMEM;
    + }

    for (idx = 0; idx < bank->nr_pins; ++idx) {
    irq = irq_of_parse_and_map(bank->of_node, idx);
    @@ -538,10 +541,13 @@ int exynos_eint_wkup_init(struct samsung
    }
    }

    - if (!muxed_banks)
    + if (!muxed_banks) {
    + of_node_put(wkup_np);
    return 0;
    + }

    irq = irq_of_parse_and_map(wkup_np, 0);
    + of_node_put(wkup_np);
    if (!irq) {
    dev_err(dev, "irq number for muxed EINTs not found\n");
    return 0;

    \
     
     \ /
      Last update: 2019-12-16 19:31    [W:2.226 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site