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

leds: el15203000: Make error handling more robust

It's easy to miss necessary clean up, e.g. firmware node reference counting,
during error path in ->probe(). Make it more robust by moving to a single
point of return.

Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Pavel Machek <pavel@ucw.cz>

authored by

Andy Shevchenko and committed by
Pavel Machek
e1012160 95138e01

+8 -9
+8 -9
drivers/leds/leds-el15203000.c
··· 245 245 ret = fwnode_property_read_u32(child, "reg", &led->reg); 246 246 if (ret) { 247 247 dev_err(priv->dev, "LED without ID number"); 248 - fwnode_handle_put(child); 249 - 250 - break; 248 + goto err_child_out; 251 249 } 252 250 253 251 if (led->reg > U8_MAX) { 254 252 dev_err(priv->dev, "LED value %d is invalid", led->reg); 255 - fwnode_handle_put(child); 256 - 257 - return -EINVAL; 253 + ret = -EINVAL; 254 + goto err_child_out; 258 255 } 259 256 260 257 led->priv = priv; ··· 273 276 dev_err(priv->dev, 274 277 "failed to register LED device %s, err %d", 275 278 led->ldev.name, ret); 276 - fwnode_handle_put(child); 277 - 278 - break; 279 + goto err_child_out; 279 280 } 280 281 281 282 led++; 282 283 } 283 284 285 + return 0; 286 + 287 + err_child_out: 288 + fwnode_handle_put(child); 284 289 return ret; 285 290 } 286 291