Unverified Commit 472b39c3 authored by Yizhuo's avatar Yizhuo Committed by Mark Brown
Browse files

regulator: max8907: Fix the usage of uninitialized variable in max8907_regulator_probe()



Inside function max8907_regulator_probe(), variable val could
be uninitialized if regmap_read() fails. However, val is used
later in the if statement to decide the content written to
"pmic", which is potentially unsafe.

Signed-off-by: default avatarYizhuo <yzhai003@ucr.edu>
Link: https://lore.kernel.org/r/20191003175813.16415-1-yzhai003@ucr.edu


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 87fd0db6
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -296,7 +296,10 @@ static int max8907_regulator_probe(struct platform_device *pdev)
	memcpy(pmic->desc, max8907_regulators, sizeof(pmic->desc));

	/* Backwards compatibility with MAX8907B; SD1 uses different voltages */
	regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val);
	ret = regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val);
	if (ret)
		return ret;

	if ((val & MAX8907_II2RR_VERSION_MASK) ==
	    MAX8907_II2RR_VERSION_REV_B) {
		pmic->desc[MAX8907_SD1].min_uV = 637500;
@@ -333,14 +336,20 @@ static int max8907_regulator_probe(struct platform_device *pdev)
		}

		if (pmic->desc[i].ops == &max8907_ldo_ops) {
			regmap_read(config.regmap, pmic->desc[i].enable_reg,
			ret = regmap_read(config.regmap, pmic->desc[i].enable_reg,
				    &val);
			if (ret)
				return ret;

			if ((val & MAX8907_MASK_LDO_SEQ) !=
			    MAX8907_MASK_LDO_SEQ)
				pmic->desc[i].ops = &max8907_ldo_hwctl_ops;
		} else if (pmic->desc[i].ops == &max8907_out5v_ops) {
			regmap_read(config.regmap, pmic->desc[i].enable_reg,
			ret = regmap_read(config.regmap, pmic->desc[i].enable_reg,
				    &val);
			if (ret)
				return ret;

			if ((val & (MAX8907_MASK_OUT5V_VINEN |
						MAX8907_MASK_OUT5V_ENSRC)) !=
			    MAX8907_MASK_OUT5V_ENSRC)