[alsa-devel] [PATCH 1/2] alsaucm: Add list1 command for non-tuple lists
snd_use_case_get_list returns lists of strings that are either: a) A sequence of single strings b) A sequence of pairs of strings all flattened into a single list
The current list command assumes layout (b) above, and hence prints nothing when printing a single-entry list that's actually in layout (a). Add a new command "list1" to dump lists in layout (a).
Signed-off-by: Stephen Warren swarren@nvidia.com --- alsaucm/usecase.c | 29 +++++++++++++++++++++-------- 1 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/alsaucm/usecase.c b/alsaucm/usecase.c index 83781d0..f24e63e 100644 --- a/alsaucm/usecase.c +++ b/alsaucm/usecase.c @@ -63,7 +63,8 @@ enum uc_cmd { OM_RESET, OM_RELOAD, OM_LISTCARDS, - OM_LIST, + OM_LIST2, + OM_LIST1,
/* set/get */ OM_SET, @@ -87,7 +88,8 @@ static struct cmd cmds[] = { { OM_RESET, 0, 1, "reset" }, { OM_RELOAD, 0, 1, "reload" }, { OM_LISTCARDS, 0, 0, "listcards" }, - { OM_LIST, 1, 1, "list" }, + { OM_LIST1, 1, 1, "list1" }, + { OM_LIST2, 1, 1, "list" }, { OM_SET, 2, 1, "set" }, { OM_GET, 1, 1, "get" }, { OM_GETI, 1, 1, "geti" }, @@ -172,7 +174,7 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv) { const char **list, *str; long lval; - int err, i; + int err, i, j, entries;
if (cmd->opencard && context->uc_mgr == NULL) { fprintf(stderr, "%s: command '%s' requires an open card\n", @@ -233,7 +235,17 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv) } snd_use_case_free_list(list, err); break; - case OM_LIST: + case OM_LIST1: + case OM_LIST2: + switch (cmd->code) { + case OM_LIST1: + entries = 1; + break; + case OM_LIST2: + entries = 2; + break; + } + err = snd_use_case_get_list(context->uc_mgr, argv[0], &list); @@ -246,10 +258,11 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv) } if (err == 0) printf(" list is empty\n"); - for (i = 0; i < err / 2; i++) { - printf(" %i: %s\n", i, list[i*2]); - if (list[i*2+1]) - printf(" %s\n", list[i*2+1]); + for (i = 0; i < err / entries; i++) { + printf(" %i: %s\n", i, list[i*entries]); + for (j = 0; j < entries - 1; j++) + if (list[i*entries+j+1]) + printf(" %s\n", list[i*entries+j+1]); } snd_use_case_free_list(list, err); break;
When snd_use_case_get_list (and hence also snd_use_case_card_list) returns an empty list, alsaucm still attempts to free it. This ends up double- freeing the returned list, or worse, freeing an invalid pointer, depending on how snd_use_case_get_list gets implemented. Fix alsaucm to return early on empty lists to avoid this.
Signed-off-by: Stephen Warren swarren@nvidia.com --- alsaucm/usecase.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/alsaucm/usecase.c b/alsaucm/usecase.c index f24e63e..1c94680 100644 --- a/alsaucm/usecase.c +++ b/alsaucm/usecase.c @@ -226,8 +226,10 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv) snd_strerror(err)); return err; } - if (err == 0) + if (err == 0) { printf(" list is empty\n"); + return 0; + } for (i = 0; i < err / 2; i++) { printf(" %i: %s\n", i, list[i*2]); if (list[i*2+1]) @@ -256,8 +258,10 @@ static int do_one(struct context *context, struct cmd *cmd, char **argv) snd_strerror(err)); return err; } - if (err == 0) + if (err == 0) { printf(" list is empty\n"); + return 0; + } for (i = 0; i < err / entries; i++) { printf(" %i: %s\n", i, list[i*entries]); for (j = 0; j < entries - 1; j++)
Date 3.6.2011 00:45, Stephen Warren wrote:
When snd_use_case_get_list (and hence also snd_use_case_card_list) returns an empty list, alsaucm still attempts to free it. This ends up double- freeing the returned list, or worse, freeing an invalid pointer, depending on how snd_use_case_get_list gets implemented. Fix alsaucm to return early on empty lists to avoid this.
All four UCM patches were applied to our GIT repos.
Jaroslav
participants (2)
-
Jaroslav Kysela
-
Stephen Warren