OSDN Git Service

alsaucm: Don't double-free empty lists
authorStephen Warren <swarren@nvidia.com>
Thu, 2 Jun 2011 22:45:13 +0000 (16:45 -0600)
committerJaroslav Kysela <perex@perex.cz>
Fri, 3 Jun 2011 09:48:12 +0000 (11:48 +0200)
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>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsaucm/usecase.c

index f24e63e..1c94680 100644 (file)
@@ -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++)