Re: [PATCH v3] ALSA: control: Fix parsing of numeric fields

From: Manuel Ebner

Date: Sun Nov 08 2026 - 11:48:44 EST


On Sun, 2026-11-08 at 12:48 +0000, Sreeraj S Kurup wrote:
> parse_uint() passes the remaining input string to kstrtoull().
>
> When the input contains comma-separated fields, the string
> contains both the numeric value and the following fields.
>
> For example, with:
>
> device=1,subdevice=0,name=Master
>
> kstrtoull() receives "1,subdevice=0,name=Master" and fails
> to parse the numeric value.
>
> Stop parsing at the next comma and pass only the numeric
> field to kstrtouint().
>
> This allows numeric fields to be parsed correctly in
> comma-separated input.
>
> Fixes: a135dfb5de15 ("ALSA: led control - add sysfs kcontrol LED marking layer")
> Signed-off-by: Sreeraj S Kurup <sreekuttan2156239@xxxxxxxxx>

Reviewed-by: Manuel Ebner

> ---
> v3:
>  - No code changes. Retain the v2 implementation after
>    comparing the alternative approaches.
> v2:
>  - Add the Fixes trailer.
>
>  sound/core/control_led.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/sound/core/control_led.c b/sound/core/control_led.c
> index 501387287ae6..3f54af2cb505 100644
> --- a/sound/core/control_led.c
> +++ b/sound/core/control_led.c
> @@ -458,11 +458,19 @@ static char *find_eos(char *s)
>  
>  static char *parse_uint(char *s, unsigned int *val)
>  {
> - unsigned long long res;
> - if (kstrtoull(s, 10, &res))
> - res = 0;
> - *val = res;
> - return find_eos(s);
> + char *end = s;
> + char delimiter;
> +
> + while (*end && *end != ',')
> + end++;
> +
> + delimiter = *end;
> + *end = '\0';
> + if (kstrtouint(s, 10, val))
> + *val = 0;
> + *end = delimiter;
> +
> + return delimiter ? end + 1 : end;
>  }
>  
>  static char *parse_string(char *s, char *val, size_t val_size)