lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 073/913] pinctrl: samsung: drop pin banks references on error paths
    Date
    From: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>

    commit 50ebd19e3585b9792e994cfa8cbee8947fe06371 upstream.

    The driver iterates over its devicetree children with
    for_each_child_of_node() and stores for later found node pointer. This
    has to be put in error paths to avoid leak during re-probing.

    Fixes: ab663789d697 ("pinctrl: samsung: Match pin banks with their device nodes")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
    Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
    Reviewed-by: Chanho Park <chanho61.park@samsung.com>
    Link: https://lore.kernel.org/r/20220111201426.326777-2-krzysztof.kozlowski@canonical.com
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/pinctrl/samsung/pinctrl-samsung.c | 30 +++++++++++++++++++++++-------
    1 file changed, 23 insertions(+), 7 deletions(-)

    --- a/drivers/pinctrl/samsung/pinctrl-samsung.c
    +++ b/drivers/pinctrl/samsung/pinctrl-samsung.c
    @@ -1002,6 +1002,16 @@ samsung_pinctrl_get_soc_data_for_of_alia
    return &(of_data->ctrl[id]);
    }

    +static void samsung_banks_of_node_put(struct samsung_pinctrl_drv_data *d)
    +{
    + struct samsung_pin_bank *bank;
    + unsigned int i;
    +
    + bank = d->pin_banks;
    + for (i = 0; i < d->nr_banks; ++i, ++bank)
    + of_node_put(bank->of_node);
    +}
    +
    /* retrieve the soc specific data */
    static const struct samsung_pin_ctrl *
    samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,
    @@ -1116,19 +1126,19 @@ static int samsung_pinctrl_probe(struct
    if (ctrl->retention_data) {
    drvdata->retention_ctrl = ctrl->retention_data->init(drvdata,
    ctrl->retention_data);
    - if (IS_ERR(drvdata->retention_ctrl))
    - return PTR_ERR(drvdata->retention_ctrl);
    + if (IS_ERR(drvdata->retention_ctrl)) {
    + ret = PTR_ERR(drvdata->retention_ctrl);
    + goto err_put_banks;
    + }
    }

    ret = samsung_pinctrl_register(pdev, drvdata);
    if (ret)
    - return ret;
    + goto err_put_banks;

    ret = samsung_gpiolib_register(pdev, drvdata);
    - if (ret) {
    - samsung_pinctrl_unregister(pdev, drvdata);
    - return ret;
    - }
    + if (ret)
    + goto err_unregister;

    if (ctrl->eint_gpio_init)
    ctrl->eint_gpio_init(drvdata);
    @@ -1138,6 +1148,12 @@ static int samsung_pinctrl_probe(struct
    platform_set_drvdata(pdev, drvdata);

    return 0;
    +
    +err_unregister:
    + samsung_pinctrl_unregister(pdev, drvdata);
    +err_put_banks:
    + samsung_banks_of_node_put(drvdata);
    + return ret;
    }

    /*

    \
     
     \ /
      Last update: 2022-04-05 16:26    [W:4.968 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site