From: Jaroslav Kysela Date: Thu, 12 Dec 2019 17:42:33 +0000 (+0100) Subject: alsa-lib: fix the array parser (unique compound keys) X-Git-Tag: v1.2.2~61 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=9980e18c3c99da42a90a98b140a0ffe7d0f92cd3;p=alsa-lib.git alsa-lib: fix the array parser (unique compound keys) The code from the old import may merge arrays wrongly and the result is a compound with same keys like: Input: lines [ "SSP0.OUT, , BUF1.3" ] lines [ "BUF2.0, , SSP0.IN" ] Parsed contents: lines { 0 'SSP0.OUT, , BUF1.3' 0 'BUF2.0, , SSP0.IN' } Proper parsed contents (create+merge mode): lines { 0 'SSP0.OUT, , BUF1.3' 1 'BUF2.0, , SSP0.IN' } Signed-off-by: Jaroslav Kysela --- diff --git a/src/conf.c b/src/conf.c index e4306504..3e753b26 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1226,7 +1226,7 @@ static int parse_value(snd_config_t **_n, snd_config_t *parent, input_t *input, static int parse_defs(snd_config_t *parent, input_t *input, int skip, int override); static int parse_array_defs(snd_config_t *farther, input_t *input, int skip, int override); -static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int skip, int override) +static int parse_array_def(snd_config_t *parent, input_t *input, int *idx, int skip, int override) { char *id = NULL; int c; @@ -1234,8 +1234,21 @@ static int parse_array_def(snd_config_t *parent, input_t *input, int idx, int sk snd_config_t *n = NULL; if (!skip) { + snd_config_t *g; char static_id[12]; - snprintf(static_id, sizeof(static_id), "%i", idx); + while (1) { + snprintf(static_id, sizeof(static_id), "%i", *idx); + if (_snd_config_search(parent, static_id, -1, &g) == 0) { + if (override) { + snd_config_delete(n); + } else { + /* merge */ + (*idx)++; + continue; + } + } + break; + } id = strdup(static_id); if (id == NULL) return -ENOMEM; @@ -1306,9 +1319,10 @@ static int parse_array_defs(snd_config_t *parent, input_t *input, int skip, int unget_char(c, input); if (c == ']') return 0; - err = parse_array_def(parent, input, idx++, skip, override); + err = parse_array_def(parent, input, &idx, skip, override); if (err < 0) return err; + idx++; } return 0; }