Re: [PATCH 2/2] ASoC: codecs: lpass-wsa-macro: Fix enum kcontrol accesses
From: Srinivas Kandagatla
Date: Wed Jul 29 2026 - 19:05:30 EST
On 7/29/26 8:38 PM, Dawid Wróbel via B4 Relay wrote:
> From: Dawid Wróbel <me@xxxxxxxxxxxxxxx>
>
> The "EAR SPKR PA Gain" control is enumerated, but
> wsa_macro_ear_spkr_pa_gain_get() and _put() access its value
> through ucontrol->value.integer.value[0] (a long) instead of
> ucontrol->value.enumerated.item[0] (an unsigned int).
>
> This same pattern was fixed in the sibling drivers by
> commit bcfe5f76cc40 ("ASoC: codecs: rx-macro: fix accessing array
> out of bounds for enum type") and
> commit 0ea5eff7c606 ("ASoC: codecs: va-macro: fix accessing array
> out of bounds for enum type"), but wsa-macro was missed.
>
> On 64-bit kernels built with CONFIG_SND_CTL_DEBUG, the elem value
> sanity check catches the 4 bytes written past the enumerated item
> and every read of this control fails with -EINVAL (access overflow).
>
> Fixes: 809bcbcecebf ("ASoC: codecs: lpass-wsa-macro: Add support to WSA Macro")
> Assisted-by: Claude:claude-fable-5
> Signed-off-by: Dawid Wróbel <me@xxxxxxxxxxxxxxx>
> ---
> sound/soc/codecs/lpass-wsa-macro.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
Thanks for fixing these,
while you are at it , can you also fix wsa_macro_rx_mux_put too, it
seems to suffer the same issue.
Also can you add CC Stable.
--srini
> diff --git a/sound/soc/codecs/lpass-wsa-macro.c b/sound/soc/codecs/lpass-wsa-macro.c
> index 5ad0448af649..c88d13c0770b 100644
> --- a/sound/soc/codecs/lpass-wsa-macro.c
> +++ b/sound/soc/codecs/lpass-wsa-macro.c
> @@ -2064,7 +2064,7 @@ static int wsa_macro_ear_spkr_pa_gain_get(struct snd_kcontrol *kcontrol,
> struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
>
> - ucontrol->value.integer.value[0] = wsa->ear_spkr_gain;
> + ucontrol->value.enumerated.item[0] = wsa->ear_spkr_gain;
>
> return 0;
> }
> @@ -2075,7 +2075,7 @@ static int wsa_macro_ear_spkr_pa_gain_put(struct snd_kcontrol *kcontrol,
> struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> struct wsa_macro *wsa = snd_soc_component_get_drvdata(component);
>
> - wsa->ear_spkr_gain = ucontrol->value.integer.value[0];
> + wsa->ear_spkr_gain = ucontrol->value.enumerated.item[0];
>
> return 0;
> }
>