Message ID | 20200506100903.15420-1-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | pinctrl: rockchip: fix memleak in rockchip_dt_node_to_map | expand |
Am Mittwoch, 6. Mai 2020, 12:09:03 CEST schrieb Dafna Hirschfeld: > 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>
On Wed, May 6, 2020 at 12:09 PM Dafna Hirschfeld <dafna.hirschfeld@collabora.com> wrote: > 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> Patch applied. Yours, Linus Walleij
diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index a9299f0bd21e..c07324d1f265 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 = {
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> --- drivers/pinctrl/pinctrl-rockchip.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)