Each iteration of for_each_child_of_node puts the previous node, but in the case of a return from the middle of the loop, there is no put, thus causing a memory leak. Hence add an of_node_put before the return in five places. Issue found with Coccinelle. Signed-off-by: Nishka Dasgupta <nishkadg.linux@xxxxxxxxx> --- drivers/leds/leds-max77650.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c index 6b74ce9cac12..417820f77c32 100644 --- a/drivers/leds/leds-max77650.c +++ b/drivers/leds/leds-max77650.c @@ -93,8 +93,10 @@ static int max77650_led_probe(struct platform_device *pdev) for_each_child_of_node(of_node, child) { rv = of_property_read_u32(child, "reg", ®); - if (rv || reg >= MAX77650_LED_NUM_LEDS) + if (rv || reg >= MAX77650_LED_NUM_LEDS) { + of_node_put(child); return -EINVAL; + } led = &leds[reg]; led->map = map; @@ -109,24 +111,32 @@ static int max77650_led_probe(struct platform_device *pdev) } else { led->cdev.name = devm_kasprintf(dev, GFP_KERNEL, "max77650:%s", label); - if (!led->cdev.name) + if (!led->cdev.name) { + of_node_put(child); return -ENOMEM; + } } of_property_read_string(child, "linux,default-trigger", &led->cdev.default_trigger); rv = devm_of_led_classdev_register(dev, child, &led->cdev); - if (rv) + if (rv) { + of_node_put(child); return rv; + } rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT); - if (rv) + if (rv) { + of_node_put(child); return rv; + } rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT); - if (rv) + if (rv) { + of_node_put(child); return rv; + } } return regmap_write(map, -- 2.19.1