Commit a0972fff authored by Johan Hovold's avatar Johan Hovold Committed by Pavel Machek

leds: lm36274: fix use-after-free on unbind

Several MFD child drivers register their class devices directly under
the parent device. This means you cannot use devres 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: 11e1bbc1 ("leds: lm36274: Introduce the TI LM36274 LED driver")
Cc: stable <stable@vger.kernel.org>     # 5.3
Cc: Dan Murphy <dmurphy@ti.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
parent d584221e
...@@ -133,7 +133,7 @@ static int lm36274_probe(struct platform_device *pdev) ...@@ -133,7 +133,7 @@ static int lm36274_probe(struct platform_device *pdev)
lm36274_data->pdev = pdev; lm36274_data->pdev = pdev;
lm36274_data->dev = lmu->dev; lm36274_data->dev = lmu->dev;
lm36274_data->regmap = lmu->regmap; lm36274_data->regmap = lmu->regmap;
dev_set_drvdata(&pdev->dev, lm36274_data); platform_set_drvdata(pdev, lm36274_data);
ret = lm36274_parse_dt(lm36274_data); ret = lm36274_parse_dt(lm36274_data);
if (ret) { if (ret) {
...@@ -147,8 +147,16 @@ static int lm36274_probe(struct platform_device *pdev) ...@@ -147,8 +147,16 @@ static int lm36274_probe(struct platform_device *pdev)
return ret; return ret;
} }
return devm_led_classdev_register(lm36274_data->dev, return led_classdev_register(lm36274_data->dev, &lm36274_data->led_dev);
&lm36274_data->led_dev); }
static int lm36274_remove(struct platform_device *pdev)
{
struct lm36274 *lm36274_data = platform_get_drvdata(pdev);
led_classdev_unregister(&lm36274_data->led_dev);
return 0;
} }
static const struct of_device_id of_lm36274_leds_match[] = { static const struct of_device_id of_lm36274_leds_match[] = {
...@@ -159,6 +167,7 @@ MODULE_DEVICE_TABLE(of, of_lm36274_leds_match); ...@@ -159,6 +167,7 @@ MODULE_DEVICE_TABLE(of, of_lm36274_leds_match);
static struct platform_driver lm36274_driver = { static struct platform_driver lm36274_driver = {
.probe = lm36274_probe, .probe = lm36274_probe,
.remove = lm36274_remove,
.driver = { .driver = {
.name = "lm36274-leds", .name = "lm36274-leds",
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment