Snap for 6183801 from 42805c33885298d249657e0fcc375d18541e85f5 to r-keystone-qcom-release

Change-Id: Ia0476b485c98f3d4bbedf712fd20123abdee3817
diff --git a/mixer.c b/mixer.c
index f26f43f..da043ac 100644
--- a/mixer.c
+++ b/mixer.c
@@ -390,11 +390,12 @@
 {
     struct mixer_ctl_group *grp;
     unsigned int n;
-    int hw_ctl_count = mixer_grp_get_count(mixer->hw_grp);
+    int hw_ctl_count;
 
     if (!mixer)
         return NULL;
 
+    hw_ctl_count = mixer_grp_get_count(mixer->hw_grp);
     if (mixer->hw_grp) {
         grp = mixer->hw_grp;
 
@@ -511,13 +512,14 @@
 
 int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id)
 {
-    struct mixer_ctl_group *grp = ctl->grp;
+    struct mixer_ctl_group *grp;
     struct snd_ctl_elem_value ev;
     int ret;
 
     if (!ctl || (id >= ctl->info->count))
         return -EINVAL;
 
+    grp = ctl->grp;
     memset(&ev, 0, sizeof(ev));
     ev.id.numid = ctl->info->id.numid;
     ret = grp->ops->ioctl(grp->data, SNDRV_CTL_IOCTL_ELEM_READ, &ev);
@@ -551,7 +553,7 @@
 
 int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count)
 {
-    struct mixer_ctl_group *grp = ctl->grp;
+    struct mixer_ctl_group *grp;
     struct snd_ctl_elem_value ev;
     int ret = 0;
     size_t size;
@@ -561,6 +563,7 @@
     if ((!ctl) || !count || !array)
         return -EINVAL;
 
+    grp = ctl->grp;
     total_count = ctl->info->count;
 
     if ((ctl->info->type == SNDRV_CTL_ELEM_TYPE_BYTES) &&
@@ -631,14 +634,14 @@
 
 int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value)
 {
-    struct mixer_ctl_group *grp = ctl->grp;
-
+    struct mixer_ctl_group *grp;
     struct snd_ctl_elem_value ev;
     int ret;
 
     if (!ctl || (id >= ctl->info->count))
         return -EINVAL;
 
+    grp = ctl->grp;
     memset(&ev, 0, sizeof(ev));
     ev.id.numid = ctl->info->id.numid;
     ret = grp->ops->ioctl(grp->data, SNDRV_CTL_IOCTL_ELEM_READ, &ev);
@@ -671,7 +674,7 @@
 
 int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count)
 {
-    struct mixer_ctl_group *grp = ctl->grp;
+    struct mixer_ctl_group *grp;
     struct snd_ctl_elem_value ev;
     size_t size;
     void *dest;
@@ -680,6 +683,7 @@
     if ((!ctl) || !count || !array)
         return -EINVAL;
 
+    grp = ctl->grp;
     total_count = ctl->info->count;
 
     if ((ctl->info->type == SNDRV_CTL_ELEM_TYPE_BYTES) &&
@@ -775,7 +779,7 @@
 
 int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string)
 {
-    struct mixer_ctl_group *grp = ctl->grp;
+    struct mixer_ctl_group *grp;
     unsigned int i, num_enums;
     struct snd_ctl_elem_value ev;
     int ret;
@@ -783,6 +787,7 @@
     if (!ctl || (ctl->info->type != SNDRV_CTL_ELEM_TYPE_ENUMERATED))
         return -EINVAL;
 
+    grp = ctl->grp;
     num_enums = ctl->info->value.enumerated.items;
     for (i = 0; i < num_enums; i++) {
         if (!strcmp(string, ctl->ename[i])) {
diff --git a/mixer_plugin.c b/mixer_plugin.c
index b3f1ccf..70c12a3 100644
--- a/mixer_plugin.c
+++ b/mixer_plugin.c
@@ -1,6 +1,6 @@
 /* mixer_plugin.c
 **
-** Copyright (c) 2019, The Linux Foundation. All rights reserved.
+** Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
 **
 ** Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
@@ -40,7 +40,6 @@
 #include <ctype.h>
 #include <poll.h>
 #include <dlfcn.h>
-#include <string.h>
 #include <sys/eventfd.h>
 #include <sys/ioctl.h>
 
@@ -324,11 +323,11 @@
     /*TODO: Fill card_info here from snd-card-def */
     memset(card_info, 0, sizeof(*card_info));
     card_info->card = plug_data->card;
-    memcpy(card_info->id, "card_id", sizeof(card_info->id));
-    memcpy(card_info->driver, "mymixer-so-name", sizeof(card_info->driver));
-    memcpy(card_info->name, "card-name", sizeof(card_info->name));
-    memcpy(card_info->longname, "card-name", sizeof(card_info->longname));
-    memcpy(card_info->mixername, "mixer-name", sizeof(card_info->mixername));
+    memcpy(card_info->id, "card_id", strlen("card_id") + 1);
+    memcpy(card_info->driver, "mymixer-so-name", strlen("mymixer-so-name") + 1);
+    memcpy(card_info->name, "card-name", strlen("card-name") + 1);
+    memcpy(card_info->longname, "card-name", strlen("card-name") + 1);
+    memcpy(card_info->mixername, "mixer-name", strlen("mixer-name") + 1);
 
     printf("%s: card = %d\n", __func__, plug_data->card);
 
@@ -408,10 +407,9 @@
 {
     struct mixer_plug_data *plug_data;
     struct mixer_plugin *plugin = NULL;
-    const char *err = NULL;
     void *dl_hdl;
     char *name, *so_name;
-    char *open_fn_name, token[80];
+    char *open_fn_name, token[80], *token_saveptr;
     int ret;
 
     plug_data = calloc(1, sizeof(*plug_data));
@@ -424,7 +422,7 @@
         /* Do not print error here.
          * It is valid for card to not have virtual mixer node
          */
-        goto err_get_mixer_node;
+        goto err_free_plug_data;
     }
 
     ret = snd_utils_get_str(plug_data->mixer_node, "so-name",
@@ -432,7 +430,7 @@
     if(ret) {
         fprintf(stderr, "%s: mixer so-name not found for card %u\n",
                 __func__, card);
-        goto err_get_mixer_node;
+        goto err_put_dev_node;
 
     }
 
@@ -440,16 +438,21 @@
     if (!dl_hdl) {
         fprintf(stderr, "%s: unable to open %s\n",
                 __func__, so_name);
-        goto err_get_mixer_node;
+        goto err_put_dev_node;
     }
 
     sscanf(so_name, "lib%s", token);
-    name = strtok(token, ".");
+    token_saveptr = token;
+    name = strtok_r(token, ".", &token_saveptr);
+    if (!name) {
+        fprintf(stderr, "%s: invalid library name\n", __func__);
+        goto err_dl_hdl;
+    }
 
     open_fn_name = calloc(1, strlen(name) + strlen("_open") + 1);
     if (!open_fn_name) {
         ret = -ENOMEM;
-        goto err_get_mixer_node;
+        goto err_dl_hdl;
     }
 
     strncpy(open_fn_name, name, strlen(name) + 1);
@@ -457,18 +460,17 @@
 
     printf("%s - %s\n", __func__, open_fn_name);
 
-    dlerror();
     plug_data->mixer_plugin_open_fn = dlsym(dl_hdl, open_fn_name);
-    if (err) {
+    if (!plug_data->mixer_plugin_open_fn) {
         fprintf(stderr, "%s: dlsym open fn failed: %s\n",
-                __func__, err);
-        goto err_get_name;
+                __func__, dlerror());
+        goto err_open_fn_name;
     }
     ret = plug_data->mixer_plugin_open_fn(&plugin, card);
     if (ret) {
         fprintf(stderr, "%s: failed to open plugin, err: %d\n",
                 __func__, ret);
-        goto err_get_name;
+        goto err_open_fn_name;
     }
 
     plug_data->plugin = plugin;
@@ -481,13 +483,19 @@
 
     printf("%s: card = %d\n", __func__, plug_data->card);
 
+    free(open_fn_name);
     return 0;
 
-err_get_name:
-    snd_utils_put_dev_node(plug_data->mixer_node);
+err_open_fn_name:
+    free(open_fn_name);
+
+err_dl_hdl:
     dlclose(dl_hdl);
 
-err_get_mixer_node:
+err_put_dev_node:
+    snd_utils_put_dev_node(plug_data->mixer_node);
+
+err_free_plug_data:
 
     free(plug_data);
     return -1;
diff --git a/pcm_plugin.c b/pcm_plugin.c
index 8ffe6ae..3e74b73 100644
--- a/pcm_plugin.c
+++ b/pcm_plugin.c
@@ -1,6 +1,6 @@
 /* pcm_plugin.c
 **
-** Copyright (c) 2019, The Linux Foundation. All rights reserved.
+** Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
 **
 ** Redistribution and use in source and binary forms, with or without
 ** modification, are permitted provided that the following conditions are
@@ -652,10 +652,9 @@
                   unsigned int flags, void **data, void *pcm_node)
 {
     struct pcm_plug_data *plug_data;
-    const char *err = NULL;
     void *dl_hdl;
     int rc = 0;
-    char *so_name, token[80], *name, *open_fn;
+    char *so_name, token[80], *name, *open_fn, *token_saveptr;
 
     plug_data = calloc(1, sizeof(*plug_data));
     if (!plug_data) {
@@ -679,8 +678,12 @@
     dlerror();
 
     sscanf(so_name, "lib%s", token);
-    name = strtok(token, ".");
-
+    token_saveptr = token;
+    name = strtok_r(token, ".", &token_saveptr);
+    if (!name) {
+        fprintf(stderr, "%s: invalid library name\n", __func__);
+        goto err_open_fn;
+    }
     open_fn = calloc(1, strlen(name) + strlen("_open") + 1);
     if (!open_fn) {
         rc = -ENOMEM;
@@ -692,11 +695,9 @@
 
     printf("%s - %s\n", __func__, open_fn);
     plug_data->plugin_open_fn = dlsym(dl_hdl, open_fn);
-    err = dlerror();
-
-    if (err) {
+    if (!plug_data->plugin_open_fn) {
         fprintf(stderr, "%s: dlsym to open fn failed, err = '%s'\n",
-                __func__, err);
+                __func__, dlerror());
         goto err_dlsym;
     }
 
@@ -720,6 +721,7 @@
 
     plug_data->plugin->state = PCM_PLUG_STATE_OPEN;
 
+    free(open_fn);
     return 0;
 
 err_dlsym: