]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ASoC: ops: Validate input values in snd_soc_put_volsw_range()
authorMark Brown <broonie@kernel.org>
Sat, 23 Apr 2022 13:12:39 +0000 (14:12 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 26 Apr 2022 14:13:36 +0000 (15:13 +0100)
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: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20220423131239.3375261-1-broonie@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-ops.c

index 58347eadd219b673780bd3baf105ba113dba3d97..e693070f51fe8113dd5a6d57c378ccb7d460e302 100644 (file)
@@ -519,7 +519,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;
@@ -534,6 +542,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