[PATCH 0/2] SX control bounds check fixups
These two SX control fixups seem to have got lost somewhere along the line. They were merged back in 5.18 but never seems to actually make it into the kernel:
https://lore.kernel.org/all/165236477046.1016627.15470197691244479154.b4-ty@...
Apologies if resending isn't the correct course but it seemed the safest way to go. Note I have made a slight fixup to the second patch.
Thanks, Charles
Mark Brown (2): ASoC: ops: Fix bounds check for _sx controls ASoC: ops: Check bounds for second channel in snd_soc_put_volsw_sx()
sound/soc/soc-ops.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
From: Mark Brown broonie@kernel.org
For _sx controls the semantics of the max field is not the usual one, max is the number of steps rather than the maximum value. This means that our check in snd_soc_put_volsw_sx() needs to just check against the maximum value.
Fixes: 4f1e50d6a9cf ("ASoC: ops: Reject out of bounds values in snd_soc_put_volsw_sx()") Signed-off-by: Mark Brown broonie@kernel.org Signed-off-by: Charles Keepax ckeepax@opensource.cirrus.com --- sound/soc/soc-ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index bd88de0563583..47691119306fb 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -452,7 +452,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, val = ucontrol->value.integer.value[0]; if (mc->platform_max && val > mc->platform_max) return -EINVAL; - if (val > max - min) + if (val > max) return -EINVAL; val_mask = mask << shift; val = (val + min) & mask;
From: Mark Brown broonie@kernel.org
The bounds checks in snd_soc_put_volsw_sx() are only being applied to the first channel, meaning it is possible to write out of bounds values to the second channel in stereo controls. Add appropriate checks.
Signed-off-by: Mark Brown broonie@kernel.org Signed-off-by: Charles Keepax ckeepax@opensource.cirrus.com ---
Slight fixup was made over your original version to make the check of val2 > max be without the min and mask applied.
Thanks, Charles
sound/soc/soc-ops.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c index 47691119306fb..55b009d3c6815 100644 --- a/sound/soc/soc-ops.c +++ b/sound/soc/soc-ops.c @@ -464,10 +464,15 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, ret = err;
if (snd_soc_volsw_is_stereo(mc)) { - unsigned int val2; + unsigned int val2 = ucontrol->value.integer.value[1]; + + if (mc->platform_max && val2 > mc->platform_max) + return -EINVAL; + if (val2 > max) + return -EINVAL;
val_mask = mask << rshift; - val2 = (ucontrol->value.integer.value[1] + min) & mask; + val2 = (val2 + min) & mask; val2 = val2 << rshift;
err = snd_soc_component_update_bits(component, reg2, val_mask,
On Fri, Nov 25, 2022 at 03:48:35PM +0000, Charles Keepax wrote:
These two SX control fixups seem to have got lost somewhere along the line. They were merged back in 5.18 but never seems to actually make it into the kernel:
https://lore.kernel.org/all/165236477046.1016627.15470197691244479154.b4-ty@...
Apologies if resending isn't the correct course but it seemed the safest way to go. Note I have made a slight fixup to the second patch.
These should already be queued as fixes.
participants (2)
-
Charles Keepax
-
Mark Brown