Hi Nishka, Thank you for the update. On 7/16/19 9:24 AM, Nishka Dasgupta wrote: > 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 create a new label, err_node_put, that puts > the previous node before returning the required value. Edit the mid-loop > return sites to instead go to this new label. > Issue found with Coccinelle. > > Signed-off-by: Nishka Dasgupta <nishkadg.linux@xxxxxxxxx> > --- > Changes in v2: > - Put the of_node_put statement under a label instead of at each return > site. > - Modify subject line to reflect previous patches on this driver. > > drivers/leds/leds-ns2.c | 17 ++++++++++++----- > 1 file changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/leds/leds-ns2.c b/drivers/leds/leds-ns2.c > index f92e2c07c1c6..83cdce0f801a 100644 > --- a/drivers/leds/leds-ns2.c > +++ b/drivers/leds/leds-ns2.c > @@ -264,11 +264,11 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) > > ret = of_get_named_gpio(child, "cmd-gpio", 0); > if (ret < 0) > - return ret; > + goto err_node_put; > led->cmd = ret; > ret = of_get_named_gpio(child, "slow-gpio", 0); > if (ret < 0) > - return ret; > + goto err_node_put; > led->slow = ret; > ret = of_property_read_string(child, "label", &string); > led->name = (ret == 0) ? string : child->name; > @@ -281,7 +281,8 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) > if (ret < 0 || ret % 3) { > dev_err(dev, > "Missing or malformed modes-map property\n"); > - return -EINVAL; > + ret = -EINVAL; > + goto err_node_put; > } > > num_modes = ret / 3; > @@ -289,8 +290,10 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) > num_modes, > sizeof(struct ns2_led_modval), > GFP_KERNEL); > - if (!modval) > - return -ENOMEM; > + if (!modval) { > + ret = -ENOMEM; > + goto err_node_put; > + } > > for (i = 0; i < num_modes; i++) { > of_property_read_u32_index(child, > @@ -314,6 +317,10 @@ ns2_leds_get_of_pdata(struct device *dev, struct ns2_led_platform_data *pdata) > pdata->num_leds = num_leds; > > return 0; > + > +err_node_put: > + of_node_put(child); > + return ret; Now we're getting build break here since ret is declared only inside the loop. I moved ret declaration to the top of the function and applied. Thanks. > } > > static const struct of_device_id of_ns2_leds_match[] = { > -- Best regards, Jacek Anaszewski