if (dobj->ops && dobj->ops->widget_unload)
dobj->ops->widget_unload(comp, dobj);
++++ + if (!w->kcontrols)
++++ + goto free_news;
++++ +
/*
* Dynamic Widgets either have 1..N enum kcontrols or mixers.
* The enum may either have an array of values or strings.
kfree(se->dobj.control.dtexts[j]);
kfree(se);
+++++ kfree(w->kcontrol_news[i].name);
}
---- - kfree(w->kcontrol_news);
} else {
/* volume mixer or bytes controls */
for (i = 0; i < w->num_kcontrols; i++) {
*/
kfree((void *)kcontrol->private_value);
snd_ctl_remove(card, kcontrol);
+++++ kfree(w->kcontrol_news[i].name);
}
---- - kfree(w->kcontrol_news);
}
++++ +
++++ +free_news:
++++ + kfree(w->kcontrol_news);
++++ +
/* widget w is freed by soc-dapm.c */
}
dev_dbg(tplg->dev, " adding DAPM widget mixer control %s at %d\n",
mc->hdr.name, i);
----- kc[i].name = mc->hdr.name;
+++++ kc[i].name = kstrdup(mc->hdr.name, GFP_KERNEL);
+++++ if (kc[i].name == NULL)
+++++ goto err_str;
kc[i].private_value = (long)sm;
kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
kc[i].access = mc->hdr.access;
kfree(sm);
continue;
}
++++ +
++++ + /* create any TLV data */
++++ + soc_tplg_create_tlv(tplg, &kc[i], &mc->hdr);
}
return kc;
err_str:
kfree(sm);
err:
----- for (--i; i >= 0; i--)
+++++ for (--i; i >= 0; i--) {
kfree((void *)kc[i].private_value);
+++++ kfree(kc[i].name);
+++++ }
kfree(kc);
return NULL;
}
dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n",
ec->hdr.name);
----- kc[i].name = ec->hdr.name;
+++++ kc[i].name = kstrdup(ec->hdr.name, GFP_KERNEL);
+++++ if (kc[i].name == NULL)
+++++ goto err_se;
kc[i].private_value = (long)se;
kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
kc[i].access = ec->hdr.access;
kfree(se->dobj.control.dtexts[j]);
kfree(se);
+++++ kfree(kc[i].name);
}
err:
kfree(kc);
"ASoC: adding bytes kcontrol %s with access 0x%x\n",
be->hdr.name, be->hdr.access);
----- kc[i].name = be->hdr.name;
+++++ kc[i].name = kstrdup(be->hdr.name, GFP_KERNEL);
+++++ if (kc[i].name == NULL)
+++++ goto err;
kc[i].private_value = (long)sbe;
kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
kc[i].access = be->hdr.access;
return kc;
err:
----- for (--i; i >= 0; i--)
+++++ for (--i; i >= 0; i--) {
kfree((void *)kc[i].private_value);
+++++ kfree(kc[i].name);
+++++ }
kfree(kc);
return NULL;