[alsa-devel] [PATCH] ASoC: topology: Fix not to keep a reference to tplg fw

Takashi Iwai tiwai at suse.de
Thu Nov 26 09:48:47 CET 2015


On Thu, 26 Nov 2015 15:11:00 +0100,
Subhransu S. Prusty wrote:
> 
> During element creation, the name of some of the elements point
> to memory referenced in tplg fw. If the tplg fw is released after
> tplg is parsed by framework, kernel panic happens during creation
> of elements while card initialization.

In which code path?  When the kctl is already instantiated from
snd_kcontrol_new template, we don't have to duplicate the string.
The only case where the strdup() is required is to delay the
instantiation, i.e. storing the kcontrol_new object itself instead of
referring temporarily.

> Issue is caught with id#87b5ed8ecb9fe05a696e1c0b53c7a49ea66432c1

You should put the commit subject, too.

> So create a copy of the memory and assign to names instead.

And who releases these duplicated memory?  It looks like another
memory leak to me.


Takashi

> Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
> Signed-off-by: Vinod Koul <vinod.koul at intel.com>
> ---
>  sound/soc/soc-topology.c | 16 ++++++++--------
>  1 file changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
> index 6963ba2..61eb1de 100644
> --- a/sound/soc/soc-topology.c
> +++ b/sound/soc/soc-topology.c
> @@ -709,7 +709,7 @@ static int soc_tplg_dbytes_create(struct soc_tplg *tplg, unsigned int count,
>  			be->hdr.name, be->hdr.access);
>  
>  		memset(&kc, 0, sizeof(kc));
> -		kc.name = be->hdr.name;
> +		kc.name = kstrdup(be->hdr.name, GFP_KERNEL);
>  		kc.private_value = (long)sbe;
>  		kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  		kc.access = be->hdr.access;
> @@ -789,7 +789,7 @@ static int soc_tplg_dmixer_create(struct soc_tplg *tplg, unsigned int count,
>  			mc->hdr.name, mc->hdr.access);
>  
>  		memset(&kc, 0, sizeof(kc));
> -		kc.name = mc->hdr.name;
> +		kc.name = kstrdup(mc->hdr.name, GFP_KERNEL);
>  		kc.private_value = (long)sm;
>  		kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  		kc.access = mc->hdr.access;
> @@ -935,7 +935,7 @@ static int soc_tplg_denum_create(struct soc_tplg *tplg, unsigned int count,
>  			ec->hdr.name, ec->items);
>  
>  		memset(&kc, 0, sizeof(kc));
> -		kc.name = ec->hdr.name;
> +		kc.name = kstrdup(ec->hdr.name, GFP_KERNEL);
>  		kc.private_value = (long)se;
>  		kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  		kc.access = ec->hdr.access;
> @@ -1105,8 +1105,8 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
>  			SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
>  			return -EINVAL;
>  
> -		route.source = elem->source;
> -		route.sink = elem->sink;
> +		route.source = kstrdup(elem->source, GFP_KERNEL);
> +		route.sink = kstrdup(elem->sink, GFP_KERNEL);
>  		route.connected = NULL; /* set to NULL atm for tplg users */
>  		if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 0)
>  			route.control = NULL;
> @@ -1149,7 +1149,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(
>  		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);
>  		kc[i].private_value = (long)sm;
>  		kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  		kc[i].access = mc->hdr.access;
> @@ -1228,7 +1228,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create(
>  	dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n",
>  		ec->hdr.name);
>  
> -	kc->name = ec->hdr.name;
> +	kc->name = kstrdup(ec->hdr.name, GFP_KERNEL);
>  	kc->private_value = (long)se;
>  	kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  	kc->access = ec->hdr.access;
> @@ -1330,7 +1330,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dbytes_create(
>  			"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);
>  		kc[i].private_value = (long)sbe;
>  		kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
>  		kc[i].access = be->hdr.access;
> -- 
> 1.9.1
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list