Skip to content

Commit 9d1a0e5

Browse files
jwrdegoedesmb49
authored andcommitted
power: supply: axp288_fuel_gauge: Fix external_power_changed race
BugLink: https://bugs.launchpad.net/bugs/2028979 commit f831977 upstream. fuel_gauge_external_power_changed() dereferences info->bat, which gets sets in axp288_fuel_gauge_probe() like this: info->bat = devm_power_supply_register(dev, &fuel_gauge_desc, &psy_cfg); As soon as devm_power_supply_register() has called device_add() the external_power_changed callback can get called. So there is a window where fuel_gauge_external_power_changed() may get called while info->bat has not been set yet leading to a NULL pointer dereference. Fixing this is easy. The external_power_changed callback gets passed the power_supply which will eventually get stored in info->bat, so fuel_gauge_external_power_changed() can simply directly use the passed in psy argument which is always valid. Fixes: 30abb3d ("power: supply: axp288_fuel_gauge: Take lock before updating the valid flag") Cc: stable@vger.kernel.org Signed-off-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Kamal Mostafa <kamal@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent 0ec595c commit 9d1a0e5

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

drivers/power/supply/axp288_fuel_gauge.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ static void fuel_gauge_external_power_changed(struct power_supply *psy)
507507
mutex_lock(&info->lock);
508508
info->valid = 0; /* Force updating of the cached registers */
509509
mutex_unlock(&info->lock);
510-
power_supply_changed(info->bat);
510+
power_supply_changed(psy);
511511
}
512512

513513
static struct power_supply_desc fuel_gauge_desc = {

0 commit comments

Comments
 (0)