Commit 6c59a17b authored by Dan Murphy's avatar Dan Murphy Committed by Sebastian Reichel
Browse files

power: supply: bq25980: Fix uninitialized wd_reg_val and overrun



Fix the issue when 'i' is equal to array size then array index over
runs the array when checking for the watch dog value.

Fixes: 5069185f ("power: supply: bq25980: Add support for the BQ259xx family")
Signed-off-by: default avatarDan Murphy <dmurphy@ti.com>
Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.com>
parent 58d1620c
Loading
Loading
Loading
Loading
+15 −14
Original line number Diff line number Diff line
@@ -1096,28 +1096,29 @@ static int bq25980_power_supply_init(struct bq25980_device *bq,
static int bq25980_hw_init(struct bq25980_device *bq)
{
	struct power_supply_battery_info bat_info = { };
	int wd_reg_val = 0;
	int wd_reg_val = BQ25980_WATCHDOG_DIS;
	int wd_max_val = BQ25980_NUM_WD_VAL - 1;
	int ret = 0;
	int curr_val;
	int volt_val;
	int i;

	if (!bq->watchdog_timer) {
		ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
					 BQ25980_WATCHDOG_DIS,
					 BQ25980_WATCHDOG_DIS);
	} else {
		for (i = 0; i < BQ25980_NUM_WD_VAL; i++) {
	if (bq->watchdog_timer) {
		if (bq->watchdog_timer >= bq25980_watchdog_time[wd_max_val])
			wd_reg_val = wd_max_val;
		else {
			for (i = 0; i < wd_max_val; i++) {
				if (bq->watchdog_timer > bq25980_watchdog_time[i] &&
				    bq->watchdog_timer < bq25980_watchdog_time[i + 1]) {
					wd_reg_val = i;
					break;
				}
			}
		}
	}

	ret = regmap_update_bits(bq->regmap, BQ25980_CHRGR_CTRL_3,
				 BQ25980_WATCHDOG_MASK, wd_reg_val);
	}
	if (ret)
		return ret;