lkml.org 
[lkml]   [2020]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.7 193/477] pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map
    Date
    From: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>

    [ Upstream commit d7faa8ffb6be57bf8233a4b5a636d76b83c51ce7 ]

    In function rockchip_dt_node_to_map, a new_map variable is
    allocated by:

    new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map),
    GFP_KERNEL);

    This uses devres and attaches new_map to the pinctrl driver.
    This cause a leak since new_map is not released when the probed
    driver is removed. Fix it by using kcalloc to allocate new_map
    and free it in `rockchip_dt_free_map`

    Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
    Reviewed-by: Heiko Stuebner <heiko@sntech.de>
    Link: https://lore.kernel.org/r/20200506100903.15420-1-dafna.hirschfeld@collabora.com
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pinctrl/pinctrl-rockchip.c | 7 ++++---
    1 file changed, 4 insertions(+), 3 deletions(-)

    diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
    index 0989513463393..d7869b636889e 100644
    --- a/drivers/pinctrl/pinctrl-rockchip.c
    +++ b/drivers/pinctrl/pinctrl-rockchip.c
    @@ -508,8 +508,8 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
    }

    map_num += grp->npins;
    - new_map = devm_kcalloc(pctldev->dev, map_num, sizeof(*new_map),
    - GFP_KERNEL);
    +
    + new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL);
    if (!new_map)
    return -ENOMEM;

    @@ -519,7 +519,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
    /* create mux map */
    parent = of_get_parent(np);
    if (!parent) {
    - devm_kfree(pctldev->dev, new_map);
    + kfree(new_map);
    return -EINVAL;
    }
    new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
    @@ -546,6 +546,7 @@ static int rockchip_dt_node_to_map(struct pinctrl_dev *pctldev,
    static void rockchip_dt_free_map(struct pinctrl_dev *pctldev,
    struct pinctrl_map *map, unsigned num_maps)
    {
    + kfree(map);
    }

    static const struct pinctrl_ops rockchip_pctrl_ops = {
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-23 22:10    [W:3.862 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site