Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: flash: mt6360: Fix device_for_each_child_node() refcounting in error paths

The device_for_each_child_node() macro requires explicit calls to
fwnode_handle_put() upon early exits to avoid memory leaks, and in
this case the error paths are handled after jumping to
'out_flash_realease', which misses that required call to
to decrement the refcount of the child node.

A more elegant and robust solution is using the scoped variant of the
loop, which automatically handles such early exits.

Fix the child node refcounting in the error paths by using
device_for_each_child_node_scoped().

Cc: stable@vger.kernel.org
Fixes: 679f8652064b ("leds: Add mt6360 driver")
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Link: https://lore.kernel.org/r/20240927-leds_device_for_each_child_node_scoped-v1-1-95c0614b38c8@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

Javier Carrasco and committed by
Lee Jones
73b03b27 da0806e4

+1 -2
+1 -2
drivers/leds/flash/leds-mt6360.c
··· 784 784 static int mt6360_led_probe(struct platform_device *pdev) 785 785 { 786 786 struct mt6360_priv *priv; 787 - struct fwnode_handle *child; 788 787 size_t count; 789 788 int i = 0, ret; 790 789 ··· 810 811 return -ENODEV; 811 812 } 812 813 813 - device_for_each_child_node(&pdev->dev, child) { 814 + device_for_each_child_node_scoped(&pdev->dev, child) { 814 815 struct mt6360_led *led = priv->leds + i; 815 816 struct led_init_data init_data = { .fwnode = child, }; 816 817 u32 reg, led_color;