Skip to content

Commit 3564cdd

Browse files
jhovoldgregkh
authored andcommitted
leds: lm3533: fix use-after-free on unbind
commit d584221 upstream. Several MFD child drivers register their class devices directly under the parent device. This means you cannot blindly do devres conversions so that deregistration ends up being tied to the parent device, something which leads to use-after-free on driver unbind when the class device is released while still being registered. Fixes: 50154e2 ("leds: lm3533: Use devm_led_classdev_register") Cc: stable <[email protected]> # 4.6 Cc: Amitoj Kaur Chawla <[email protected]> Signed-off-by: Johan Hovold <[email protected]> Signed-off-by: Pavel Machek <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 385c1ae commit 3564cdd

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

drivers/leds/leds-lm3533.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
694694

695695
platform_set_drvdata(pdev, led);
696696

697-
ret = devm_led_classdev_register(pdev->dev.parent, &led->cdev);
697+
ret = led_classdev_register(pdev->dev.parent, &led->cdev);
698698
if (ret) {
699699
dev_err(&pdev->dev, "failed to register LED %d\n", pdev->id);
700700
return ret;
@@ -704,13 +704,18 @@ static int lm3533_led_probe(struct platform_device *pdev)
704704

705705
ret = lm3533_led_setup(led, pdata);
706706
if (ret)
707-
return ret;
707+
goto err_deregister;
708708

709709
ret = lm3533_ctrlbank_enable(&led->cb);
710710
if (ret)
711-
return ret;
711+
goto err_deregister;
712712

713713
return 0;
714+
715+
err_deregister:
716+
led_classdev_unregister(&led->cdev);
717+
718+
return ret;
714719
}
715720

716721
static int lm3533_led_remove(struct platform_device *pdev)
@@ -720,6 +725,7 @@ static int lm3533_led_remove(struct platform_device *pdev)
720725
dev_dbg(&pdev->dev, "%s\n", __func__);
721726

722727
lm3533_ctrlbank_disable(&led->cb);
728+
led_classdev_unregister(&led->cdev);
723729

724730
return 0;
725731
}

0 commit comments

Comments
 (0)