From 9980e18c3c99da42a90a98b140a0ffe7d0f92cd3 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Thu, 12 Dec 2019 18:42:33 +0100 Subject: [PATCH] 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 --- src/conf.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) 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; } -- 2.47.3