463 lines
14 KiB
Diff
463 lines
14 KiB
Diff
From 78212445de4c8e07873cbc7dff2abcacd031f151 Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Tue, 1 Jun 2021 17:47:42 +0200
|
|
Subject: [PATCH 1/9] alsactl: fix the nested iteration
|
|
|
|
There may be nested iterations for hw: card names.
|
|
Handle this card name in snd_card_iterator_sinit().
|
|
|
|
BugLink: https://github.com/alsa-project/alsa-lib/issues/142
|
|
Fixes: eefc2c6 ("alsactl: use card iterator functions for all card loops")
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/utils.c | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
diff --git a/alsactl/utils.c b/alsactl/utils.c
|
|
index c79fd95..881b505 100644
|
|
--- a/alsactl/utils.c
|
|
+++ b/alsactl/utils.c
|
|
@@ -247,6 +247,8 @@ int snd_card_iterator_sinit(struct snd_card_iterator *iter, const char *cardname
|
|
int cardno = -1;
|
|
|
|
if (cardname) {
|
|
+ if (strncmp(cardname, "hw:", 3) == 0)
|
|
+ cardname += 3;
|
|
cardno = snd_card_get_index(cardname);
|
|
if (cardno < 0) {
|
|
error("Cannot find soundcard '%s'...", cardname);
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From 3d7a6facd9e1f962eef6c4ba3aa4cdc22477a6ac Mon Sep 17 00:00:00 2001
|
|
From: Chao Song <chao.song@linux.intel.com>
|
|
Date: Mon, 31 May 2021 10:29:57 +0800
|
|
Subject: [PATCH 2/9] topology: fix potential null pointer from strchr
|
|
|
|
This patch adds check to the return pointer from strchr,
|
|
because it may be null and cause segment fault, if component
|
|
is not properly constructed.
|
|
|
|
Fixes: https://github.com/alsa-project/alsa-utils/pull/91
|
|
Signed-off-by: Chao Song <chao.song@linux.intel.com>
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
topology/pre-process-dapm.c | 5 +++++
|
|
topology/pre-process-object.c | 5 +++++
|
|
2 files changed, 10 insertions(+)
|
|
|
|
diff --git a/topology/pre-process-dapm.c b/topology/pre-process-dapm.c
|
|
index 450ca71..dbaf2f1 100644
|
|
--- a/topology/pre-process-dapm.c
|
|
+++ b/topology/pre-process-dapm.c
|
|
@@ -146,6 +146,11 @@ static int tplg_pp_get_widget_name(struct tplg_pre_processor *tplg_pp,
|
|
|
|
/* get class name */
|
|
args = strchr(string, '.');
|
|
+ if (!args) {
|
|
+ SNDERR("Error getting class name for %s\n", string);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
class_name = calloc(1, strlen(string) - strlen(args) + 1);
|
|
if (!class_name)
|
|
return -ENOMEM;
|
|
diff --git a/topology/pre-process-object.c b/topology/pre-process-object.c
|
|
index 09aa375..ac8caec 100644
|
|
--- a/topology/pre-process-object.c
|
|
+++ b/topology/pre-process-object.c
|
|
@@ -492,6 +492,11 @@ static int tplg_pp_add_object_tuple_section(struct tplg_pre_processor *tplg_pp,
|
|
}
|
|
|
|
type = strchr(token_ref, '.');
|
|
+ if(!type) {
|
|
+ SNDERR("Error getting type for %s\n", token_ref);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
token = calloc(1, strlen(token_ref) - strlen(type) + 1);
|
|
if (!token)
|
|
return -ENOMEM;
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From d6d566a9eebb63dd9d1351b07d385d39cdc33beb Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 09:53:56 +0200
|
|
Subject: [PATCH 3/9] alsactl: return error value in dump_config_tree()
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/alsactl.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c
|
|
index a011284..05738fb 100644
|
|
--- a/alsactl/alsactl.c
|
|
+++ b/alsactl/alsactl.c
|
|
@@ -170,7 +170,7 @@ static int dump_config_tree(snd_config_t *top)
|
|
return err;
|
|
err = snd_config_save(top, out);
|
|
snd_output_close(out);
|
|
- return 0;
|
|
+ return err;
|
|
}
|
|
|
|
static int dump_state(const char *file)
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From 511dd7a597735048f3883ef7883adf853ac2de4a Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 09:56:20 +0200
|
|
Subject: [PATCH 4/9] alsactl: init() - return error value from
|
|
snd_card_iterator_sinit() call
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/init_parse.c | 2 ++
|
|
1 file changed, 2 insertions(+)
|
|
|
|
diff --git a/alsactl/init_parse.c b/alsactl/init_parse.c
|
|
index 9d0f473..e439de7 100644
|
|
--- a/alsactl/init_parse.c
|
|
+++ b/alsactl/init_parse.c
|
|
@@ -1751,6 +1751,8 @@ int init(const char *cfgdir, const char *filename, int flags, const char *cardna
|
|
|
|
sysfs_init();
|
|
err = snd_card_iterator_sinit(&iter, cardname);
|
|
+ if (err < 0)
|
|
+ goto out;
|
|
while (snd_card_iterator_next(&iter)) {
|
|
err = snd_card_clean_cfgdir(cfgdir, iter.card);
|
|
if (err < 0) {
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From 2bc595e7bd9a9b8f8605104cfdb8f40a07c2655b Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 09:58:46 +0200
|
|
Subject: [PATCH 5/9] alsactl: check for error values from snd_config_get...()
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/state.c | 41 ++++++++++++++++++++++++++++-------------
|
|
1 file changed, 28 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/alsactl/state.c b/alsactl/state.c
|
|
index 44fda3f..b3a3f4d 100644
|
|
--- a/alsactl/state.c
|
|
+++ b/alsactl/state.c
|
|
@@ -655,13 +655,16 @@ static long config_iface(snd_config_t *n)
|
|
const char *str;
|
|
switch (snd_config_get_type(n)) {
|
|
case SND_CONFIG_TYPE_INTEGER:
|
|
- snd_config_get_integer(n, &i);
|
|
+ if (snd_config_get_integer(n, &i) < 0)
|
|
+ return -1;
|
|
return i;
|
|
case SND_CONFIG_TYPE_INTEGER64:
|
|
- snd_config_get_integer64(n, &li);
|
|
+ if (snd_config_get_integer64(n, &li) < 0)
|
|
+ return -1;
|
|
return li;
|
|
case SND_CONFIG_TYPE_STRING:
|
|
- snd_config_get_string(n, &str);
|
|
+ if (snd_config_get_string(n, &str) < 0)
|
|
+ return -1;
|
|
break;
|
|
default:
|
|
return -1;
|
|
@@ -681,17 +684,20 @@ static int config_bool(snd_config_t *n, int doit)
|
|
|
|
switch (snd_config_get_type(n)) {
|
|
case SND_CONFIG_TYPE_INTEGER:
|
|
- snd_config_get_integer(n, &val);
|
|
+ if (snd_config_get_integer(n, &val) < 0)
|
|
+ return -1;
|
|
if (val < 0 || val > 1)
|
|
return -1;
|
|
return val;
|
|
case SND_CONFIG_TYPE_INTEGER64:
|
|
- snd_config_get_integer64(n, &lval);
|
|
+ if (snd_config_get_integer64(n, &lval) < 0)
|
|
+ return -1;
|
|
if (lval < 0 || lval > 1)
|
|
return -1;
|
|
return (int) lval;
|
|
case SND_CONFIG_TYPE_STRING:
|
|
- snd_config_get_string(n, &str);
|
|
+ if (snd_config_get_string(n, &str) < 0)
|
|
+ return -1;
|
|
break;
|
|
case SND_CONFIG_TYPE_COMPOUND:
|
|
if (!force_restore || !doit)
|
|
@@ -718,13 +724,16 @@ static int config_enumerated(snd_config_t *n, snd_ctl_t *handle,
|
|
|
|
switch (snd_config_get_type(n)) {
|
|
case SND_CONFIG_TYPE_INTEGER:
|
|
- snd_config_get_integer(n, &val);
|
|
+ if (snd_config_get_integer(n, &val) < 0)
|
|
+ return -1;
|
|
return val;
|
|
case SND_CONFIG_TYPE_INTEGER64:
|
|
- snd_config_get_integer64(n, &lval);
|
|
+ if (snd_config_get_integer64(n, &lval) < 0)
|
|
+ return -1;
|
|
return (int) lval;
|
|
case SND_CONFIG_TYPE_STRING:
|
|
- snd_config_get_string(n, &str);
|
|
+ if (snd_config_get_string(n, &str) < 0)
|
|
+ return -1;
|
|
break;
|
|
case SND_CONFIG_TYPE_COMPOUND:
|
|
if (!force_restore || !doit)
|
|
@@ -1247,6 +1256,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
|
|
}
|
|
if (strcmp(fld, "iface") == 0) {
|
|
iface = (snd_ctl_elem_iface_t)config_iface(n);
|
|
+ if (iface < 0)
|
|
+ return -EINVAL;
|
|
continue;
|
|
}
|
|
if (strcmp(fld, "device") == 0) {
|
|
@@ -1254,7 +1265,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
|
|
cerror(doit, "control.%d.%s is invalid", numid, fld);
|
|
return -EINVAL;
|
|
}
|
|
- snd_config_get_integer(n, &device);
|
|
+ if (snd_config_get_integer(n, &device) < 0)
|
|
+ return -EINVAL;
|
|
continue;
|
|
}
|
|
if (strcmp(fld, "subdevice") == 0) {
|
|
@@ -1262,7 +1274,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
|
|
cerror(doit, "control.%d.%s is invalid", numid, fld);
|
|
return -EINVAL;
|
|
}
|
|
- snd_config_get_integer(n, &subdevice);
|
|
+ if (snd_config_get_integer(n, &subdevice) < 0)
|
|
+ return -EINVAL;
|
|
continue;
|
|
}
|
|
if (strcmp(fld, "name") == 0) {
|
|
@@ -1270,7 +1283,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
|
|
cerror(doit, "control.%d.%s is invalid", numid, fld);
|
|
return -EINVAL;
|
|
}
|
|
- snd_config_get_string(n, &name);
|
|
+ if (snd_config_get_string(n, &name) < 0)
|
|
+ return -EINVAL;
|
|
continue;
|
|
}
|
|
if (strcmp(fld, "index") == 0) {
|
|
@@ -1278,7 +1292,8 @@ static int set_control(snd_ctl_t *handle, snd_config_t *control,
|
|
cerror(doit, "control.%d.%s is invalid", numid, fld);
|
|
return -EINVAL;
|
|
}
|
|
- snd_config_get_integer(n, &index);
|
|
+ if (snd_config_get_integer(n, &index) < 0)
|
|
+ return -EINVAL;
|
|
continue;
|
|
}
|
|
if (strcmp(fld, "value") == 0) {
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From 646d6ff094a82153db49af176cba3aacbde46cf6 Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 10:04:50 +0200
|
|
Subject: [PATCH 6/9] =?UTF-8?q?alsactl:=20state=20-=20fix=20=E2=80=98item?=
|
|
=?UTF-8?q?=E2=80=99=20may=20be=20used=20uninitialized=20gcc=20warning?=
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/state.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/alsactl/state.c b/alsactl/state.c
|
|
index b3a3f4d..9c75688 100644
|
|
--- a/alsactl/state.c
|
|
+++ b/alsactl/state.c
|
|
@@ -229,7 +229,7 @@ static int get_control(snd_ctl_t *handle, snd_ctl_elem_id_t *id, snd_config_t *t
|
|
{
|
|
snd_ctl_elem_value_t *ctl;
|
|
snd_ctl_elem_info_t *info;
|
|
- snd_config_t *control, *comment, *item, *value;
|
|
+ snd_config_t *control, *comment, *item = NULL, *value;
|
|
const char *s;
|
|
char buf[256];
|
|
unsigned int idx;
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From cd2f779b8d6439479b9802e9fd2c8af86f8702fb Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 10:08:18 +0200
|
|
Subject: [PATCH 7/9] alsactl: fix lock_fd unlock in load_configuration() -
|
|
error path
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
alsactl/utils.c | 6 ++++--
|
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/alsactl/utils.c b/alsactl/utils.c
|
|
index 881b505..fd4a108 100644
|
|
--- a/alsactl/utils.c
|
|
+++ b/alsactl/utils.c
|
|
@@ -220,15 +220,17 @@ int load_configuration(const char *file, snd_config_t **top, int *open_failed)
|
|
}
|
|
err = snd_config_load(config, in);
|
|
snd_input_close(in);
|
|
- if (lock_fd >= 0)
|
|
- state_unlock(lock_fd, file);
|
|
if (err < 0) {
|
|
error("snd_config_load error: %s", snd_strerror(err));
|
|
out:
|
|
+ if (lock_fd >= 0)
|
|
+ state_unlock(lock_fd, file);
|
|
snd_config_delete(config);
|
|
snd_config_update_free_global();
|
|
return err;
|
|
} else {
|
|
+ if (lock_fd >= 0)
|
|
+ state_unlock(lock_fd, file);
|
|
*top = config;
|
|
return 0;
|
|
}
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From 74ad91245f8257e242cf5b5b6b809f94321f197a Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 10:12:06 +0200
|
|
Subject: [PATCH 8/9] axfer: fix wrong calloc() item size in
|
|
allocate_containers()
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
axfer/subcmd-transfer.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/axfer/subcmd-transfer.c b/axfer/subcmd-transfer.c
|
|
index 27d2cc5..839215a 100644
|
|
--- a/axfer/subcmd-transfer.c
|
|
+++ b/axfer/subcmd-transfer.c
|
|
@@ -155,7 +155,7 @@ static int allocate_containers(struct context *ctx, unsigned int count)
|
|
return -ENOMEM;
|
|
ctx->cntr_count = count;
|
|
|
|
- ctx->cntr_fds = calloc(count, sizeof(*ctx->cntrs));
|
|
+ ctx->cntr_fds = calloc(count, sizeof(*ctx->cntr_fds));
|
|
if (ctx->cntr_fds == NULL)
|
|
return -ENOMEM;
|
|
|
|
--
|
|
2.30.2
|
|
|
|
|
|
From c58f981e1530557835461b17b92eac6c475e5f68 Mon Sep 17 00:00:00 2001
|
|
From: Jaroslav Kysela <perex@perex.cz>
|
|
Date: Fri, 4 Jun 2021 10:19:22 +0200
|
|
Subject: [PATCH 9/9] topology: fix few coverity detected defects
|
|
|
|
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
|
|
---
|
|
topology/pre-process-dapm.c | 3 ++-
|
|
topology/pre-process-object.c | 15 ++++++++++-----
|
|
topology/pre-processor.c | 2 +-
|
|
3 files changed, 13 insertions(+), 7 deletions(-)
|
|
|
|
diff --git a/topology/pre-process-dapm.c b/topology/pre-process-dapm.c
|
|
index dbaf2f1..dc510e1 100644
|
|
--- a/topology/pre-process-dapm.c
|
|
+++ b/topology/pre-process-dapm.c
|
|
@@ -203,7 +203,8 @@ static int tplg_pp_get_widget_name(struct tplg_pre_processor *tplg_pp,
|
|
|
|
if (!args) {
|
|
SNDERR("insufficient arugments for widget %s\n", string);
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ goto err;
|
|
}
|
|
|
|
remaining = strchr(args + 1, '.');
|
|
diff --git a/topology/pre-process-object.c b/topology/pre-process-object.c
|
|
index ac8caec..7565091 100644
|
|
--- a/topology/pre-process-object.c
|
|
+++ b/topology/pre-process-object.c
|
|
@@ -463,7 +463,8 @@ static snd_config_t *tplg_object_lookup_in_config(struct tplg_pre_processor *tpl
|
|
if (!config_id)
|
|
return NULL;
|
|
|
|
- snd_config_search(class, config_id, &obj_cfg);
|
|
+ if (snd_config_search(class, config_id, &obj_cfg) < 0)
|
|
+ return NULL;
|
|
free(config_id);
|
|
return obj_cfg;
|
|
}
|
|
@@ -704,11 +705,12 @@ static int tplg_add_object_data(struct tplg_pre_processor *tplg_pp, snd_config_t
|
|
|
|
ret = tplg_pp_add_object_tuple_section(tplg_pp, class_cfg, n, data_cfg_name,
|
|
token);
|
|
- free(data_cfg_name);
|
|
if (ret < 0) {
|
|
SNDERR("Failed to add data section %s\n", data_cfg_name);
|
|
+ free(data_cfg_name);
|
|
return ret;
|
|
}
|
|
+ free(data_cfg_name);
|
|
}
|
|
|
|
return 0;
|
|
@@ -1215,8 +1217,10 @@ static int tplg_construct_object_name(struct tplg_pre_processor *tplg_pp, snd_co
|
|
return 0;
|
|
|
|
/* set class name as the name prefix for the object */
|
|
- snd_config_get_id(obj, &obj_id);
|
|
- snd_config_get_id(class_cfg, &class_id);
|
|
+ if (snd_config_get_id(obj, &obj_id) < 0)
|
|
+ return -EINVAL;
|
|
+ if (snd_config_get_id(class_cfg, &class_id) < 0)
|
|
+ return -EINVAL;
|
|
new_name = strdup(class_id);
|
|
if (!new_name)
|
|
return -ENOMEM;
|
|
@@ -1280,7 +1284,8 @@ static int tplg_construct_object_name(struct tplg_pre_processor *tplg_pp, snd_co
|
|
default:
|
|
SNDERR("Argument '%s' in object '%s.%s' is not an integer or a string\n",
|
|
s, class_id, obj_id);
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ goto err;
|
|
}
|
|
|
|
/* alloc and concat arg value to the name */
|
|
diff --git a/topology/pre-processor.c b/topology/pre-processor.c
|
|
index 0458c3c..442dcc4 100644
|
|
--- a/topology/pre-processor.c
|
|
+++ b/topology/pre-processor.c
|
|
@@ -183,7 +183,7 @@ int init_pre_precessor(struct tplg_pre_processor **tplg_pp, snd_output_type_t ty
|
|
|
|
_tplg_pp = calloc(1, sizeof(struct tplg_pre_processor));
|
|
if (!_tplg_pp)
|
|
- ret = -ENOMEM;
|
|
+ return -ENOMEM;
|
|
|
|
*tplg_pp = _tplg_pp;
|
|
|
|
--
|
|
2.30.2
|
|
|