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

Commit f66d3fa5 authored by Mark Brown's avatar Mark Brown Committed by Greg Kroah-Hartman
Browse files

ASoC: ops: Validate input values in snd_soc_put_volsw_range()



[ Upstream commit aa22125c57f9e577f0a667e4fa07fc3fa8ca1e60 ]

Check that values written via snd_soc_put_volsw_range() are
within the range advertised by the control, ensuring that we
don't write out of spec values to the hardware.

Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20220423131239.3375261-1-broonie@kernel.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 13b850a6
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -523,7 +523,15 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
	unsigned int mask = (1 << fls(max)) - 1;
	unsigned int invert = mc->invert;
	unsigned int val, val_mask;
	int err, ret;
	int err, ret, tmp;

	tmp = ucontrol->value.integer.value[0];
	if (tmp < 0)
		return -EINVAL;
	if (mc->platform_max && tmp > mc->platform_max)
		return -EINVAL;
	if (tmp > mc->max - mc->min + 1)
		return -EINVAL;

	if (invert)
		val = (max - ucontrol->value.integer.value[0]) & mask;
@@ -538,6 +546,14 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
	ret = err;

	if (snd_soc_volsw_is_stereo(mc)) {
		tmp = ucontrol->value.integer.value[1];
		if (tmp < 0)
			return -EINVAL;
		if (mc->platform_max && tmp > mc->platform_max)
			return -EINVAL;
		if (tmp > mc->max - mc->min + 1)
			return -EINVAL;

		if (invert)
			val = (max - ucontrol->value.integer.value[1]) & mask;
		else