All checks were successful
target_linux_generic / Update target_linux_generic (openwrt-25.12) (push) Successful in 8s
69 lines
2.1 KiB
Diff
69 lines
2.1 KiB
Diff
From f63e7c8a83892781f6ceb55566f9497639c44555 Mon Sep 17 00:00:00 2001
|
|
From: Miaoqian Lin <linmq006@gmail.com>
|
|
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: stable@vger.kernel.org
|
|
Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
|
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Link: https://patch.msgid.link/20250901073224.2273103-1-linmq006@gmail.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
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;
|
|
}
|