net dsa: qca8k: fix usages of device_get_named_child_node()
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Thu, 6 Jun 2024 16:13:03 +0000 (19:13 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 10 Jun 2024 12:12:14 +0000 (13:12 +0100)
The documentation for device_get_named_child_node() mentions this
important point:

"
The caller is responsible for calling fwnode_handle_put() on the
returned fwnode pointer.
"

Add fwnode_handle_put() to avoid leaked references.

Fixes: 1e264f9d2918 ("net: dsa: qca8k: add LEDs basic support")
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/qca/qca8k-leds.c

index 811ebee..43ac680 100644 (file)
@@ -431,8 +431,11 @@ qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int p
                init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d",
                                                 priv->internal_mdio_bus->id,
                                                 port_num);
-               if (!init_data.devicename)
+               if (!init_data.devicename) {
+                       fwnode_handle_put(led);
+                       fwnode_handle_put(leds);
                        return -ENOMEM;
+               }
 
                ret = devm_led_classdev_register_ext(priv->dev, &port_led->cdev, &init_data);
                if (ret)
@@ -441,6 +444,7 @@ qca8k_parse_port_leds(struct qca8k_priv *priv, struct fwnode_handle *port, int p
                kfree(init_data.devicename);
        }
 
+       fwnode_handle_put(leds);
        return 0;
 }
 
@@ -471,9 +475,13 @@ qca8k_setup_led_ctrl(struct qca8k_priv *priv)
                 * the correct port for LED setup.
                 */
                ret = qca8k_parse_port_leds(priv, port, qca8k_port_to_phy(port_num));
-               if (ret)
+               if (ret) {
+                       fwnode_handle_put(port);
+                       fwnode_handle_put(ports);
                        return ret;
+               }
        }
 
+       fwnode_handle_put(ports);
        return 0;
 }