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: