[PATCH 23/28] mfd: ab8500-core: Register sysfs attribute groups via devm_device_add_group()
From: Lee Jones
Date: Wed Oct 21 2026 - 08:27:11 EST
ab8500_probe() registers up to two sysfs attribute groups with
sysfs_create_group(). On AB8505 and AB9540 (cut 2.0 and later), the
second sysfs_create_group() call unconditionally overwrites the return
value of the first, and if the second call fails, ab8500_probe() returns
an error without removing the first group. Because the driver context
is freed and driver data is cleared on probe failure, reading any leaked
sysfs attribute dereferences a NULL ab8500 pointer in
get_register_interruptible().
Register the attribute groups via devm_device_add_group() and only
register the second group when the first succeeds so that devres
automatically cleans up registered sysfs attributes on probe failure.
Fixes: 93ff722e8853 ("ab8500-fg: Add power cut feature for ab8505 and ab8540")
Closes: https://sashiko.dev/#/bug/linux-a9ac1a9d-5a97-4ad3-b4c5-c7775c24a333
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Lee Jones <lee@xxxxxxxxxx>
---
drivers/mfd/ab8500-core.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index 86fa99022cb3..408bad2f577a 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -1232,16 +1232,13 @@ static int ab8500_probe(struct platform_device *pdev)
if (((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
ab8500->chip_id >= AB8500_CUT2P0) || is_ab8540(ab8500))
- ret = sysfs_create_group(&ab8500->dev->kobj,
- &ab9540_attr_group);
+ ret = devm_device_add_group(ab8500->dev, &ab9540_attr_group);
else
- ret = sysfs_create_group(&ab8500->dev->kobj,
- &ab8500_attr_group);
+ ret = devm_device_add_group(ab8500->dev, &ab8500_attr_group);
if ((is_ab8505(ab8500) || is_ab9540(ab8500)) &&
- ab8500->chip_id >= AB8500_CUT2P0)
- ret = sysfs_create_group(&ab8500->dev->kobj,
- &ab8505_attr_group);
+ ab8500->chip_id >= AB8500_CUT2P0 && !ret)
+ ret = devm_device_add_group(ab8500->dev, &ab8505_attr_group);
if (ret)
dev_err(ab8500->dev, "error creating sysfs entries\n");
--
2.56.0.218.g1ec904b173-goog