|
@@ -513,7 +513,7 @@ static void remove_widget(struct snd_soc_component *comp,
|
|
|
*/
|
|
|
if (dobj->widget.kcontrol_type == SND_SOC_TPLG_TYPE_ENUM) {
|
|
|
/* enumerated widget mixer */
|
|
|
- for (i = 0; i < w->num_kcontrols; i++) {
|
|
|
+ for (i = 0; w->kcontrols != NULL && i < w->num_kcontrols; i++) {
|
|
|
struct snd_kcontrol *kcontrol = w->kcontrols[i];
|
|
|
struct soc_enum *se =
|
|
|
(struct soc_enum *)kcontrol->private_value;
|
|
@@ -530,7 +530,7 @@ static void remove_widget(struct snd_soc_component *comp,
|
|
|
}
|
|
|
} else {
|
|
|
/* volume mixer or bytes controls */
|
|
|
- for (i = 0; i < w->num_kcontrols; i++) {
|
|
|
+ for (i = 0; w->kcontrols != NULL && i < w->num_kcontrols; i++) {
|
|
|
struct snd_kcontrol *kcontrol = w->kcontrols[i];
|
|
|
|
|
|
if (dobj->widget.kcontrol_type
|
|
@@ -1325,8 +1325,10 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create(
|
|
|
ec->hdr.name);
|
|
|
|
|
|
kc[i].name = kstrdup(ec->hdr.name, GFP_KERNEL);
|
|
|
- if (kc[i].name == NULL)
|
|
|
+ if (kc[i].name == NULL) {
|
|
|
+ kfree(se);
|
|
|
goto err_se;
|
|
|
+ }
|
|
|
kc[i].private_value = (long)se;
|
|
|
kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
|
|
kc[i].access = ec->hdr.access;
|
|
@@ -1442,8 +1444,10 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create(
|
|
|
be->hdr.name, be->hdr.access);
|
|
|
|
|
|
kc[i].name = kstrdup(be->hdr.name, GFP_KERNEL);
|
|
|
- if (kc[i].name == NULL)
|
|
|
+ if (kc[i].name == NULL) {
|
|
|
+ kfree(sbe);
|
|
|
goto err;
|
|
|
+ }
|
|
|
kc[i].private_value = (long)sbe;
|
|
|
kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
|
|
kc[i].access = be->hdr.access;
|
|
@@ -2576,7 +2580,7 @@ int snd_soc_tplg_component_remove(struct snd_soc_component *comp, u32 index)
|
|
|
|
|
|
/* match index */
|
|
|
if (dobj->index != index &&
|
|
|
- dobj->index != SND_SOC_TPLG_INDEX_ALL)
|
|
|
+ index != SND_SOC_TPLG_INDEX_ALL)
|
|
|
continue;
|
|
|
|
|
|
switch (dobj->type) {
|