|
|
@@ -0,0 +1,68 @@
|
|
|
+From f63e7c8a83892781f6ceb55566f9497639c44555 Mon Sep 17 00:00:00 2001
|
|
|
+From: Miaoqian Lin <[email protected]>
|
|
|
+Date: Mon, 1 Sep 2025 15:32:23 +0800
|
|
|
+Subject: net: dsa: mv88e6xxx: Fix fwnode reference leaks in
|
|
|
+ mv88e6xxx_port_setup_leds
|
|
|
+
|
|
|
+Fix multiple fwnode reference leaks:
|
|
|
+
|
|
|
+1. The function calls fwnode_get_named_child_node() to get the "leds" node,
|
|
|
+ but never calls fwnode_handle_put(leds) to release this reference.
|
|
|
+
|
|
|
+2. Within the fwnode_for_each_child_node() loop, the early return
|
|
|
+ paths that don't properly release the "led" fwnode reference.
|
|
|
+
|
|
|
+This fix follows the same pattern as commit d029edefed39
|
|
|
+("net dsa: qca8k: fix usages of device_get_named_child_node()")
|
|
|
+
|
|
|
+Fixes: 94a2a84f5e9e ("net: dsa: mv88e6xxx: Support LED control")
|
|
|
+Cc: [email protected]
|
|
|
+Signed-off-by: Miaoqian Lin <[email protected]>
|
|
|
+Reviewed-by: Linus Walleij <[email protected]>
|
|
|
+Link: https://patch.msgid.link/[email protected]
|
|
|
+Signed-off-by: Jakub Kicinski <[email protected]>
|
|
|
+---
|
|
|
+ drivers/net/dsa/mv88e6xxx/leds.c | 17 +++++++++++++----
|
|
|
+ 1 file changed, 13 insertions(+), 4 deletions(-)
|
|
|
+
|
|
|
+--- a/drivers/net/dsa/mv88e6xxx/leds.c
|
|
|
++++ b/drivers/net/dsa/mv88e6xxx/leds.c
|
|
|
+@@ -779,7 +779,8 @@ int mv88e6xxx_port_setup_leds(struct mv8
|
|
|
+ continue;
|
|
|
+ if (led_num > 1) {
|
|
|
+ dev_err(dev, "invalid LED specified port %d\n", port);
|
|
|
+- return -EINVAL;
|
|
|
++ ret = -EINVAL;
|
|
|
++ goto err_put_led;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (led_num == 0)
|
|
|
+@@ -823,17 +824,25 @@ int mv88e6xxx_port_setup_leds(struct mv8
|
|
|
+ init_data.devname_mandatory = true;
|
|
|
+ init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d:0%d", chip->info->name,
|
|
|
+ port, led_num);
|
|
|
+- if (!init_data.devicename)
|
|
|
+- return -ENOMEM;
|
|
|
++ if (!init_data.devicename) {
|
|
|
++ ret = -ENOMEM;
|
|
|
++ goto err_put_led;
|
|
|
++ }
|
|
|
+
|
|
|
+ ret = devm_led_classdev_register_ext(dev, l, &init_data);
|
|
|
+ kfree(init_data.devicename);
|
|
|
+
|
|
|
+ if (ret) {
|
|
|
+ dev_err(dev, "Failed to init LED %d for port %d", led_num, port);
|
|
|
+- return ret;
|
|
|
++ goto err_put_led;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
++ fwnode_handle_put(leds);
|
|
|
+ return 0;
|
|
|
++
|
|
|
++err_put_led:
|
|
|
++ fwnode_handle_put(led);
|
|
|
++ fwnode_handle_put(leds);
|
|
|
++ return ret;
|
|
|
+ }
|