ALSA: control led - improve the set_led_id() parser
authorJaroslav Kysela <perex@perex.cz>
Wed, 31 Mar 2021 18:07:25 +0000 (20:07 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 1 Apr 2021 08:04:18 +0000 (10:04 +0200)
It may be possible that the string pointer does not move
when parsing. Add a code which detects this state and
simply break the parser loop in this case.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20210331180725.663623-1-perex@perex.cz
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/control_led.c

index d4fb8b8..788fd9e 100644 (file)
@@ -506,7 +506,7 @@ static char *parse_iface(char *s, unsigned int *val)
 static ssize_t set_led_id(struct snd_ctl_led_card *led_card, const char *buf, size_t count,
                          bool attach)
 {
-       char buf2[256], *s;
+       char buf2[256], *s, *os;
        size_t len = max(sizeof(s) - 1, count);
        struct snd_ctl_elem_id id;
        int err;
@@ -517,6 +517,7 @@ static ssize_t set_led_id(struct snd_ctl_led_card *led_card, const char *buf, si
        id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
        s = buf2;
        while (*s) {
+               os = s;
                if (!strncasecmp(s, "numid=", 6)) {
                        s = parse_uint(s + 6, &id.numid);
                } else if (!strncasecmp(s, "iface=", 6)) {
@@ -546,6 +547,8 @@ static ssize_t set_led_id(struct snd_ctl_led_card *led_card, const char *buf, si
                }
                if (*s == ',')
                        s++;
+               if (s == os)
+                       break;
        }
 
        err = snd_ctl_led_set_id(led_card->number, &id, led_card->led->group, attach);