2020-08-23 19:34:19

by Sumera Priyadarsini

[permalink] [raw]
Subject: [PATCH V3] net: dsa: Add of_node_put() before break and return statements

Every iteration of for_each_child_of_node() decrements
the reference count of the previous node, however when control
is transferred from the middle of the loop, as in the case of
a return or break or goto, there is no decrement thus ultimately
resulting in a memory leak.

Fix a potential memory leak in mt7530.c by inserting of_node_put()
before the break and return statements.

Issue found with Coccinelle.

---
Changes in v2:
Add another of_node_put() in for_each_child_of_node() as pointed
out by Andrew.

Changes in v3:
- Correct syntax errors
- Modify commit message

---

Signed-off-by: Sumera Priyadarsini <[email protected]>

Signed-off-by: Sumera Priyadarsini <[email protected]>
---
drivers/net/dsa/mt7530.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
index 8dcb8a49ab67..4b4701c69fe1 100644
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@ -1326,14 +1326,17 @@ mt7530_setup(struct dsa_switch *ds)

if (phy_node->parent == priv->dev->of_node->parent) {
ret = of_get_phy_mode(mac_np, &interface);
- if (ret && ret != -ENODEV)
+ if (ret && ret != -ENODEV) {
+ of_node_put(mac_np);
return ret;
+ }
id = of_mdio_parse_addr(ds->dev, phy_node);
if (id == 0)
priv->p5_intf_sel = P5_INTF_SEL_PHY_P0;
if (id == 4)
priv->p5_intf_sel = P5_INTF_SEL_PHY_P4;
}
+ of_node_put(mac_np);
of_node_put(phy_node);
break;
}
--
2.17.1


2020-08-24 13:22:04

by David Miller

[permalink] [raw]
Subject: Re: [PATCH V3] net: dsa: Add of_node_put() before break and return statements

From: Sumera Priyadarsini <[email protected]>
Date: Mon, 24 Aug 2020 01:00:54 +0530

> ---
>
> Signed-off-by: Sumera Priyadarsini <[email protected]>
>
> Signed-off-by: Sumera Priyadarsini <[email protected]>

You only need one Signed-off-by:

You must not put the signoff after the "---" otherwise GIT will remove
it from the commit log message when I try to apply your patch.

Combine this with the fact that your change didn't even compile
properly up until even V2, I wish you would put more effort and
care into your patch submission. It feels to reviewers like
you are just throwing this patch onto the mailing list without
much care or testing at all.

Thank you.

2020-08-24 13:38:40

by Vladimir Oltean

[permalink] [raw]
Subject: Re: [PATCH V3] net: dsa: Add of_node_put() before break and return statements

On Mon, Aug 24, 2020 at 01:00:54AM +0530, Sumera Priyadarsini wrote:
> Every iteration of for_each_child_of_node() decrements
> the reference count of the previous node, however when control
> is transferred from the middle of the loop, as in the case of
> a return or break or goto, there is no decrement thus ultimately
> resulting in a memory leak.
>
> Fix a potential memory leak in mt7530.c by inserting of_node_put()
> before the break and return statements.
>
> Issue found with Coccinelle.
>
> ---
> Changes in v2:
> Add another of_node_put() in for_each_child_of_node() as pointed
> out by Andrew.
>
> Changes in v3:
> - Correct syntax errors
> - Modify commit message
>
> ---
>
> Signed-off-by: Sumera Priyadarsini <[email protected]>
>
> Signed-off-by: Sumera Priyadarsini <[email protected]>
> ---

If you need to resend anyway, can we please have a proper commit prefix?
A patch on mt7530.c shouldn't be "net: dsa: " but "net: dsa: mt7530: "
as "git log" will tell you. The difference is relevant because "net:
dsa: " typically refers to the generic code in net/dsa/.

> drivers/net/dsa/mt7530.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c
> index 8dcb8a49ab67..4b4701c69fe1 100644
> --- a/drivers/net/dsa/mt7530.c
> +++ b/drivers/net/dsa/mt7530.c
> @@ -1326,14 +1326,17 @@ mt7530_setup(struct dsa_switch *ds)
>
> if (phy_node->parent == priv->dev->of_node->parent) {
> ret = of_get_phy_mode(mac_np, &interface);
> - if (ret && ret != -ENODEV)
> + if (ret && ret != -ENODEV) {
> + of_node_put(mac_np);
> return ret;
> + }
> id = of_mdio_parse_addr(ds->dev, phy_node);
> if (id == 0)
> priv->p5_intf_sel = P5_INTF_SEL_PHY_P0;
> if (id == 4)
> priv->p5_intf_sel = P5_INTF_SEL_PHY_P4;
> }
> + of_node_put(mac_np);
> of_node_put(phy_node);
> break;
> }
> --
> 2.17.1
>

Thanks,
-Vladimir