aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMengdong Lin <mengdong.lin@linux.intel.com>2016-11-02 13:02:59 -0400
committerMark Brown <broonie@kernel.org>2016-11-03 12:27:57 -0400
commit8f27c4abc2cd7a31adb896a6b4861cdcb921d063 (patch)
tree72dae1a29c26cd3fceb2b9c4c004d380dc727787
parent55726dc95b78da32454878ac2b8a76daa53db396 (diff)
ASoC: topology: Only use valid names of PCM for the kernel DAI & DAI link
User space may not always set a valid FE DAI driver's name, FE DAI link's name, stream name or cpu DAI name. In such cases, there are all ZERO in these name string buffers of a topology PCM object. This patch will only duplicate valid name strings for kernel FE DAI driver and DAI link when creating them from topology, and free the name strings when destroying them. Signed-off-by: Mengdong Lin <mengdong.lin@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/soc-topology.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 03edde57bfea..0f1c8ebf8cda 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -523,6 +523,7 @@ static void remove_dai(struct snd_soc_component *comp,
523 if (dobj->ops && dobj->ops->dai_unload) 523 if (dobj->ops && dobj->ops->dai_unload)
524 dobj->ops->dai_unload(comp, dobj); 524 dobj->ops->dai_unload(comp, dobj);
525 525
526 kfree(dai_drv->name);
526 list_del(&dobj->list); 527 list_del(&dobj->list);
527 kfree(dai_drv); 528 kfree(dai_drv);
528} 529}
@@ -540,6 +541,10 @@ static void remove_link(struct snd_soc_component *comp,
540 if (dobj->ops && dobj->ops->link_unload) 541 if (dobj->ops && dobj->ops->link_unload)
541 dobj->ops->link_unload(comp, dobj); 542 dobj->ops->link_unload(comp, dobj);
542 543
544 kfree(link->name);
545 kfree(link->stream_name);
546 kfree(link->cpu_dai_name);
547
543 list_del(&dobj->list); 548 list_del(&dobj->list);
544 snd_soc_remove_dai_link(comp->card, link); 549 snd_soc_remove_dai_link(comp->card, link);
545 kfree(link); 550 kfree(link);
@@ -1638,7 +1643,8 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
1638 if (dai_drv == NULL) 1643 if (dai_drv == NULL)
1639 return -ENOMEM; 1644 return -ENOMEM;
1640 1645
1641 dai_drv->name = pcm->dai_name; 1646 if (strlen(pcm->dai_name))
1647 dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL);
1642 dai_drv->id = pcm->dai_id; 1648 dai_drv->id = pcm->dai_id;
1643 1649
1644 if (pcm->playback) { 1650 if (pcm->playback) {
@@ -1681,11 +1687,15 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
1681 if (link == NULL) 1687 if (link == NULL)
1682 return -ENOMEM; 1688 return -ENOMEM;
1683 1689
1684 link->name = pcm->pcm_name; 1690 if (strlen(pcm->pcm_name)) {
1685 link->stream_name = pcm->pcm_name; 1691 link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
1692 link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
1693 }
1686 link->id = pcm->pcm_id; 1694 link->id = pcm->pcm_id;
1687 1695
1688 link->cpu_dai_name = pcm->dai_name; 1696 if (strlen(pcm->dai_name))
1697 link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL);
1698
1689 link->codec_name = "snd-soc-dummy"; 1699 link->codec_name = "snd-soc-dummy";
1690 link->codec_dai_name = "snd-soc-dummy-dai"; 1700 link->codec_dai_name = "snd-soc-dummy-dai";
1691 1701