Skip to content

Commit 6b3f0df

Browse files
jhovoldgregkh
authored andcommitted
leds: da903x: fix use-after-free on unbind
commit 6f4aa35 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: eed1625 ("leds: da903x: 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 6de8169 commit 6b3f0df

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

drivers/leds/leds-da903x.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,23 @@ static int da903x_led_probe(struct platform_device *pdev)
113113
led->flags = pdata->flags;
114114
led->master = pdev->dev.parent;
115115

116-
ret = devm_led_classdev_register(led->master, &led->cdev);
116+
ret = led_classdev_register(led->master, &led->cdev);
117117
if (ret) {
118118
dev_err(&pdev->dev, "failed to register LED %d\n", id);
119119
return ret;
120120
}
121121

122+
platform_set_drvdata(pdev, led);
123+
124+
return 0;
125+
}
126+
127+
static int da903x_led_remove(struct platform_device *pdev)
128+
{
129+
struct da903x_led *led = platform_get_drvdata(pdev);
130+
131+
led_classdev_unregister(&led->cdev);
132+
122133
return 0;
123134
}
124135

@@ -127,6 +138,7 @@ static struct platform_driver da903x_led_driver = {
127138
.name = "da903x-led",
128139
},
129140
.probe = da903x_led_probe,
141+
.remove = da903x_led_remove,
130142
};
131143

132144
module_platform_driver(da903x_led_driver);

0 commit comments

Comments
 (0)