| From c3c631ef3332f66e1a04d3d1fca575f1d95bf460 Mon Sep 17 00:00:00 2001 |
| From: Wen Yang <wen.yang99@zte.com.cn> |
| Date: Fri, 12 Apr 2019 14:02:21 +0800 |
| Subject: pinctrl: st: fix leaked of_node references |
| |
| [ Upstream commit 483d70d73beaecab55882fcd2a357af72674e24c ] |
| |
| The call to of_get_child_by_name returns a node pointer with refcount |
| incremented thus it must be explicitly decremented after the last |
| usage. |
| |
| Detected by coccinelle with the following warnings: |
| ./drivers/pinctrl/pinctrl-st.c:1188:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. |
| ./drivers/pinctrl/pinctrl-st.c:1188:3-9: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. |
| ./drivers/pinctrl/pinctrl-st.c:1199:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. |
| ./drivers/pinctrl/pinctrl-st.c:1199:2-8: ERROR: missing of_node_put; acquired a node pointer with refcount incremented on line 1175, but without a corresponding object release within this function. |
| |
| Signed-off-by: Wen Yang <wen.yang99@zte.com.cn> |
| Cc: Patrice Chotard <patrice.chotard@st.com> |
| Cc: Linus Walleij <linus.walleij@linaro.org> |
| Cc: linux-gpio@vger.kernel.org |
| Cc: linux-kernel@vger.kernel.org (open list) |
| Reviewed-by: Patrice Chotard <patrice.chotard@st.com> |
| Signed-off-by: Linus Walleij <linus.walleij@linaro.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pinctrl/pinctrl-st.c | 15 ++++++++++----- |
| 1 file changed, 10 insertions(+), 5 deletions(-) |
| |
| diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c |
| index e66af93f2cbf8..195b442a23434 100644 |
| --- a/drivers/pinctrl/pinctrl-st.c |
| +++ b/drivers/pinctrl/pinctrl-st.c |
| @@ -1170,7 +1170,7 @@ static int st_pctl_dt_parse_groups(struct device_node *np, |
| struct property *pp; |
| struct st_pinconf *conf; |
| struct device_node *pins; |
| - int i = 0, npins = 0, nr_props; |
| + int i = 0, npins = 0, nr_props, ret = 0; |
| |
| pins = of_get_child_by_name(np, "st,pins"); |
| if (!pins) |
| @@ -1185,7 +1185,8 @@ static int st_pctl_dt_parse_groups(struct device_node *np, |
| npins++; |
| } else { |
| pr_warn("Invalid st,pins in %pOFn node\n", np); |
| - return -EINVAL; |
| + ret = -EINVAL; |
| + goto out_put_node; |
| } |
| } |
| |
| @@ -1195,8 +1196,10 @@ static int st_pctl_dt_parse_groups(struct device_node *np, |
| grp->pin_conf = devm_kcalloc(info->dev, |
| npins, sizeof(*conf), GFP_KERNEL); |
| |
| - if (!grp->pins || !grp->pin_conf) |
| - return -ENOMEM; |
| + if (!grp->pins || !grp->pin_conf) { |
| + ret = -ENOMEM; |
| + goto out_put_node; |
| + } |
| |
| /* <bank offset mux direction rt_type rt_delay rt_clk> */ |
| for_each_property_of_node(pins, pp) { |
| @@ -1229,9 +1232,11 @@ static int st_pctl_dt_parse_groups(struct device_node *np, |
| } |
| i++; |
| } |
| + |
| +out_put_node: |
| of_node_put(pins); |
| |
| - return 0; |
| + return ret; |
| } |
| |
| static int st_pctl_parse_functions(struct device_node *np, |
| -- |
| 2.20.1 |
| |