[alsa-devel] [PATCH 1/3] ascenario: Add check for set scenario in snd_scenario_get_control_id()

Stefan Schmidt stefan at datenfreihafen.org
Fri Oct 9 17:53:29 CEST 2009


From: Stefan Schmidt <stefan at slimlogic.co.uk>

Without this check we may have the situation that scn->current_scenario ==
scn->num_scenarios and then we get our values from a wrong memory area. Could
happen if you use the function directly after snd_scenario_list()

Also use short instead of int for the numids.

Signed-off-by: Stefan Schmidt <stefan at slimlogic.co.uk>
---
 src/ascenario.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/src/ascenario.c b/src/ascenario.c
index 11912ab..d2a9519 100644
--- a/src/ascenario.c
+++ b/src/ascenario.c
@@ -1349,7 +1349,8 @@ int snd_scenario_get_integer(snd_scenario_t *scn, int type, int *value)
 int snd_scenario_get_control_id(snd_scenario_t *scn, int type,
 				snd_ctl_elem_id_t *id)
 {
-	int numid, ret, i, count, tmp;
+	short numid, tmp;
+	int ret, i, count;
 	snd_ctl_t *handle;
 	snd_ctl_card_info_t *info;
 	snd_ctl_elem_list_t *list;
@@ -1357,6 +1358,11 @@ int snd_scenario_get_control_id(snd_scenario_t *scn, int type,
 	snd_ctl_card_info_alloca(&info);
 	snd_ctl_elem_list_alloca(&list);
 
+	if (scn->current_scenario >= scn->num_scenarios) {
+		scn_error("%s: No scenario set.\n", __func__);
+                return -EINVAL;
+	}
+
 	switch (type) {
 	case SND_SCN_KCTL_MASTER_PLAYBACK_VOLUME:
 		numid = scn->scenario[scn->current_scenario].playback_volume_id;
-- 
1.6.4.3



More information about the Alsa-devel mailing list