Blob Blame History Raw
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