led: qcom-lpg: Fix resource leaks in for_each_available_child_of_node() loops
authorLu Hongfei <luhongfei@vivo.com>
Thu, 25 May 2023 11:17:03 +0000 (19:17 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 23 Aug 2023 15:52:23 +0000 (17:52 +0200)
[ Upstream commit 8f38f8fa7261819eb7d4fb369dc3bfab72259033 ]

Ensure child node references are decremented properly in the error path.

Signed-off-by: Lu Hongfei <luhongfei@vivo.com>
Link: https://lore.kernel.org/r/20230525111705.3055-1-luhongfei@vivo.com
Signed-off-by: Lee Jones <lee@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/leds/rgb/leds-qcom-lpg.c

index f1c2419..f85a5d6 100644 (file)
@@ -1112,8 +1112,10 @@ static int lpg_add_led(struct lpg *lpg, struct device_node *np)
                i = 0;
                for_each_available_child_of_node(np, child) {
                        ret = lpg_parse_channel(lpg, child, &led->channels[i]);
-                       if (ret < 0)
+                       if (ret < 0) {
+                               of_node_put(child);
                                return ret;
+                       }
 
                        info[i].color_index = led->channels[i]->color;
                        info[i].intensity = 0;
@@ -1291,8 +1293,10 @@ static int lpg_probe(struct platform_device *pdev)
 
        for_each_available_child_of_node(pdev->dev.of_node, np) {
                ret = lpg_add_led(lpg, np);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        return ret;
+               }
        }
 
        for (i = 0; i < lpg->num_channels; i++)