Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c94a3d40 authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Sebastian Reichel
Browse files

power_supply: 88pm860x_charger: Fix possible NULL pointer dereference and use...


power_supply: 88pm860x_charger: Fix possible NULL pointer dereference and use of initialized variable

Do not put reference to power supply in early exit paths of
pm860x_done_handler() because:
1. it is not yet initialized,
2. it is NULL.

This fixes possible NULL pointer dereference and following build
warning:
drivers/power/88pm860x_charger.c: In function ‘pm860x_done_handler’:
drivers/power/88pm860x_charger.c:516:18: warning: ‘psy’ may be used uninitialized in this function [-Wmaybe-uninitialized]

Additionally this puts the power supply reference before unlocking
mutex. This actually is not needed (there is no race here) but has
logical sense and makes the exit paths cleaner.

Reported-by: default avatarkbuild test robot <fengguang.wu@intel.com>
Signed-off-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parent d3a6097b
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -495,7 +495,7 @@ static irqreturn_t pm860x_done_handler(int irq, void *data)
	ret = power_supply_get_property(psy, POWER_SUPPLY_PROP_VOLTAGE_NOW,
			&val);
	if (ret)
		goto out;
		goto out_psy_put;
	vbatt = val.intval / 1000;
	/*
	 * CHG_DONE interrupt is faster than CHG_DET interrupt when
@@ -506,14 +506,15 @@ static irqreturn_t pm860x_done_handler(int irq, void *data)
	 */
	ret = pm860x_reg_read(info->i2c, PM8607_STATUS_2);
	if (ret < 0)
		goto out;
		goto out_psy_put;
	if (vbatt > CHARGE_THRESHOLD && ret & STATUS2_CHG)
		power_supply_set_property(psy, POWER_SUPPLY_PROP_CHARGE_FULL,
				&val);

out_psy_put:
	power_supply_put(psy);
out:
	mutex_unlock(&info->lock);
	power_supply_put(psy);
	dev_dbg(info->dev, "%s, Allowed: %d\n", __func__, info->allowed);
	set_charging_fsm(info);