Commit b5031b7d authored by YueHaibing's avatar YueHaibing Committed by Linus Walleij
Browse files

pinctrl: berlin: fix 'pctrl->functions' allocation in berlin_pinctrl_build_state



fixes following Smatch static check warning:

 drivers/pinctrl/berlin/berlin.c:237 berlin_pinctrl_build_state()
 warn: passing devm_ allocated variable to kfree. 'pctrl->functions'

As we will be calling krealloc() on pointer 'pctrl->functions', which means
kfree() will be called in there, devm_kzalloc() shouldn't be used with
the allocation in the first place.  Fix the warning by calling kcalloc()
and managing the free procedure in error path on our own.

Fixes: 3de68d33 ("pinctrl: berlin: add the core pinctrl driver for Marvell Berlin SoCs")
Signed-off-by: default avatarYueHaibing <yuehaibing@huawei.com>
Reviewed-by: default avatarJisheng Zhang <Jisheng.Zhang@synaptics.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 40b25bce
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -216,10 +216,8 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
	}

	/* we will reallocate later */
	pctrl->functions = devm_kcalloc(&pdev->dev,
					max_functions,
					sizeof(*pctrl->functions),
					GFP_KERNEL);
	pctrl->functions = kcalloc(max_functions,
				   sizeof(*pctrl->functions), GFP_KERNEL);
	if (!pctrl->functions)
		return -ENOMEM;

@@ -257,8 +255,10 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
				function++;
			}

			if (!found)
			if (!found) {
				kfree(pctrl->functions);
				return -EINVAL;
			}

			if (!function->groups) {
				function->groups =
@@ -267,9 +267,11 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
						     sizeof(char *),
						     GFP_KERNEL);

				if (!function->groups)
				if (!function->groups) {
					kfree(pctrl->functions);
					return -ENOMEM;
				}
			}

			groups = function->groups;
			while (*groups)