Skip to content

Commit 289721f

Browse files
charleskeepaxgregkh
authored andcommitted
ASoC: ops: Correct bounds check for second channel on SX controls
commit f33bcc5 upstream. Currently the check against the max value for the control is being applied after the value has had the minimum applied and been masked. But the max value simply indicates the number of volume levels on an SX control, and as such should just be applied on the raw value. Fixes: 97eea94 ("ASoC: ops: Check bounds for second channel in snd_soc_put_volsw_sx()") Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20221125162348.1288005-1-ckeepax@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent de0866b commit 289721f

1 file changed

Lines changed: 3 additions & 4 deletions

File tree

sound/soc/soc-ops.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -447,16 +447,15 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
447447
ret = err;
448448

449449
if (snd_soc_volsw_is_stereo(mc)) {
450-
unsigned int val2;
451-
452-
val_mask = mask << rshift;
453-
val2 = (ucontrol->value.integer.value[1] + min) & mask;
450+
unsigned int val2 = ucontrol->value.integer.value[1];
454451

455452
if (mc->platform_max && val2 > mc->platform_max)
456453
return -EINVAL;
457454
if (val2 > max)
458455
return -EINVAL;
459456

457+
val_mask = mask << rshift;
458+
val2 = (val2 + min) & mask;
460459
val2 = val2 << rshift;
461460

462461
err = snd_soc_component_update_bits(component, reg2, val_mask,

0 commit comments

Comments
 (0)