control: ctlparse - make numid parsing more robust

Also correct the last amixer stderr printf to snd_error().

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
Jaroslav Kysela 2026-01-29 15:33:45 +01:00
parent 7887fbc6f0
commit bc332f4211

View file

@ -156,8 +156,10 @@ char *snd_ctl_ascii_elem_id_get(snd_ctl_elem_id_t *id)
int __snd_ctl_ascii_elem_id_parse(snd_ctl_elem_id_t *dst, const char *str, int __snd_ctl_ascii_elem_id_parse(snd_ctl_elem_id_t *dst, const char *str,
const char **ret_ptr) const char **ret_ptr)
{ {
int c, size, numid; char buf[64];
int c, size;
int err = -EINVAL; int err = -EINVAL;
long l;
char *ptr; char *ptr;
while (isspace(*str)) while (isspace(*str))
@ -168,12 +170,23 @@ int __snd_ctl_ascii_elem_id_parse(snd_ctl_elem_id_t *dst, const char *str,
while (*str) { while (*str) {
if (!strncasecmp(str, "numid=", 6)) { if (!strncasecmp(str, "numid=", 6)) {
str += 6; str += 6;
numid = atoi(str); ptr = buf;
if (numid <= 0) { size = 0;
fprintf(stderr, "amixer: Invalid numid %d\n", numid); while (*str && *str != ',') {
if (size < (int)sizeof(buf)) {
*ptr++ = *str;
size++;
}
str++;
}
*ptr = '\0';
if (safe_strtol(buf, &l) < 0)
l = -1;
if (l <= 0 || l >= INT32_MAX) {
snd_error(CONTROL, "Invalid numid %ld (%s)", l, buf);
goto out; goto out;
} }
snd_ctl_elem_id_set_numid(dst, atoi(str)); snd_ctl_elem_id_set_numid(dst, (int)l);
while (isdigit(*str)) while (isdigit(*str))
str++; str++;
} else if (!strncasecmp(str, "iface=", 6)) { } else if (!strncasecmp(str, "iface=", 6)) {
@ -200,7 +213,6 @@ int __snd_ctl_ascii_elem_id_parse(snd_ctl_elem_id_t *dst, const char *str,
goto out; goto out;
} }
} else if (!strncasecmp(str, "name=", 5)) { } else if (!strncasecmp(str, "name=", 5)) {
char buf[64];
str += 5; str += 5;
ptr = buf; ptr = buf;
size = 0; size = 0;