On 19.05.2022 20:54, Mark Brown wrote:
On Thu, May 19, 2022 at 08:49:48PM +0300, Alexey Khoroshilov wrote:
On 19.05.2022 20:29, Mark Brown wrote:
On Thu, May 19, 2022 at 08:10:12PM +0300, Alexey Khoroshilov wrote:
- if (sel < 0 || sel > mc->max)
- if (sel > mc->max)
The check needs to be moved, not removed. The userspace ABI allows passing in of negative values.
Would (sel > mc->max) be enough in this case anyway?
Oh, the check won't be working properly - it's just that like I say the fix is to move rather than remove it so it's operating on the signed value.
Do you mean something like this?
static int max98090_put_enab_tlv(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct max98090_priv *max98090 = snd_soc_component_get_drvdata(component); 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;
switch (mc->reg) { case M98090_REG_MIC1_INPUT_LEVEL: select = &(max98090->pa1en); break; case M98090_REG_MIC2_INPUT_LEVEL: select = &(max98090->pa2en); break; case M98090_REG_ADC_SIDETONE: select = &(max98090->sidetone); break; default: return -EINVAL; }
val = (val >> mc->shift) & mask;
- if (sel < 0 || sel > mc->max) + if (sel_unchecked < 0 || sel_unchecked > mc->max) return -EINVAL; + sel = sel_unchecked;
*select = sel;