Skip to content

Commit ae1cd9f

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 6b3f0df commit ae1cd9f

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
@@ -698,7 +698,7 @@ static int lm3533_led_probe(struct platform_device *pdev)
698698

699699
platform_set_drvdata(pdev, led);
700700

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

709709
ret = lm3533_led_setup(led, pdata);
710710
if (ret)
711-
return ret;
711+
goto err_deregister;
712712

713713
ret = lm3533_ctrlbank_enable(&led->cb);
714714
if (ret)
715-
return ret;
715+
goto err_deregister;
716716

717717
return 0;
718+
719+
err_deregister:
720+
led_classdev_unregister(&led->cdev);
721+
722+
return ret;
718723
}
719724

720725
static int lm3533_led_remove(struct platform_device *pdev)
@@ -724,6 +729,7 @@ static int lm3533_led_remove(struct platform_device *pdev)
724729
dev_dbg(&pdev->dev, "%s\n", __func__);
725730

726731
lm3533_ctrlbank_disable(&led->cb);
732+
led_classdev_unregister(&led->cdev);
727733

728734
return 0;
729735
}

0 commit comments

Comments
 (0)