From: Alexey Khoroshilov Date: Thu, 19 May 2022 22:31:26 +0000 (+0300) Subject: ASoC: max98090: Move check for invalid values before casting in max98090_put_enab_tlv() X-Git-Tag: v5.19-rc1~152^2~2^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f7a344468105ef8c54086dfdc800e6f5a8417d3e;p=thirdparty%2Fkernel%2Flinux.git ASoC: max98090: Move check for invalid values before casting in max98090_put_enab_tlv() Validation of signed input should be done before casting to unsigned int. Found by Linux Verification Center (linuxtesting.org) with SVACE. Signed-off-by: Alexey Khoroshilov Suggested-by: Mark Brown Fixes: 2fbe467bcbfc ("ASoC: max98090: Reject invalid values in custom control put()") Link: https://lore.kernel.org/r/1652999486-29653-1-git-send-email-khoroshilov@ispras.ru Signed-off-by: Mark Brown --- diff --git a/sound/soc/codecs/max98090.c b/sound/soc/codecs/max98090.c index 48dcf071bb5ad..576277a82d41a 100644 --- a/sound/soc/codecs/max98090.c +++ b/sound/soc/codecs/max98090.c @@ -393,7 +393,8 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; unsigned int mask = (1 << fls(mc->max)) - 1; - unsigned int sel = ucontrol->value.integer.value[0]; + int sel_unchecked = ucontrol->value.integer.value[0]; + unsigned int sel; unsigned int val = snd_soc_component_read(component, mc->reg); unsigned int *select; int change; @@ -414,8 +415,9 @@ static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, val = (val >> mc->shift) & mask; - if (sel < 0 || sel > mc->max) + if (sel_unchecked < 0 || sel_unchecked > mc->max) return -EINVAL; + sel = sel_unchecked; change = *select != sel; *select = sel;