Commit c42464a4 authored by Amadeusz Sławiński's avatar Amadeusz Sławiński Committed by Mark Brown

ASoC: topology: Perform component check upfront

Function soc_tplg_dbytes_create(), calls soc_tplg_init_kcontrol() to
perform additional driver specific initialization. While
soc_tplg_init_kcontrol() ensures that component is valid before invoking
ops->control_load, there is no such check at the end of
soc_tplg_dbytes_create() where list_add() is used.

Also in quite a few places, there is reference of tplg->comp->dapm or
tplg->comp->card, without any checks for tplg->comp.

In consequence of the above this may lead to referencing NULL pointer.

This allows for removal of now unnecessary checks.
Signed-off-by: default avatarAmadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Link: https://lore.kernel.org/r/20200312122239.14489-1-amadeuszx.slawinski@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6187509b
...@@ -251,7 +251,7 @@ static int soc_tplg_vendor_load_(struct soc_tplg *tplg, ...@@ -251,7 +251,7 @@ static int soc_tplg_vendor_load_(struct soc_tplg *tplg,
{ {
int ret = 0; int ret = 0;
if (tplg->comp && tplg->ops && tplg->ops->vendor_load) if (tplg->ops && tplg->ops->vendor_load)
ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr); ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr);
else { else {
dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n", dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n",
...@@ -283,7 +283,7 @@ static int soc_tplg_vendor_load(struct soc_tplg *tplg, ...@@ -283,7 +283,7 @@ static int soc_tplg_vendor_load(struct soc_tplg *tplg,
static int soc_tplg_widget_load(struct soc_tplg *tplg, static int soc_tplg_widget_load(struct soc_tplg *tplg,
struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w) struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w)
{ {
if (tplg->comp && tplg->ops && tplg->ops->widget_load) if (tplg->ops && tplg->ops->widget_load)
return tplg->ops->widget_load(tplg->comp, tplg->index, w, return tplg->ops->widget_load(tplg->comp, tplg->index, w,
tplg_w); tplg_w);
...@@ -295,7 +295,7 @@ static int soc_tplg_widget_load(struct soc_tplg *tplg, ...@@ -295,7 +295,7 @@ static int soc_tplg_widget_load(struct soc_tplg *tplg,
static int soc_tplg_widget_ready(struct soc_tplg *tplg, static int soc_tplg_widget_ready(struct soc_tplg *tplg,
struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w) struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w)
{ {
if (tplg->comp && tplg->ops && tplg->ops->widget_ready) if (tplg->ops && tplg->ops->widget_ready)
return tplg->ops->widget_ready(tplg->comp, tplg->index, w, return tplg->ops->widget_ready(tplg->comp, tplg->index, w,
tplg_w); tplg_w);
...@@ -307,7 +307,7 @@ static int soc_tplg_dai_load(struct soc_tplg *tplg, ...@@ -307,7 +307,7 @@ static int soc_tplg_dai_load(struct soc_tplg *tplg,
struct snd_soc_dai_driver *dai_drv, struct snd_soc_dai_driver *dai_drv,
struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai) struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai)
{ {
if (tplg->comp && tplg->ops && tplg->ops->dai_load) if (tplg->ops && tplg->ops->dai_load)
return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv, return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv,
pcm, dai); pcm, dai);
...@@ -318,7 +318,7 @@ static int soc_tplg_dai_load(struct soc_tplg *tplg, ...@@ -318,7 +318,7 @@ static int soc_tplg_dai_load(struct soc_tplg *tplg,
static int soc_tplg_dai_link_load(struct soc_tplg *tplg, static int soc_tplg_dai_link_load(struct soc_tplg *tplg,
struct snd_soc_dai_link *link, struct snd_soc_tplg_link_config *cfg) struct snd_soc_dai_link *link, struct snd_soc_tplg_link_config *cfg)
{ {
if (tplg->comp && tplg->ops && tplg->ops->link_load) if (tplg->ops && tplg->ops->link_load)
return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg); return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg);
return 0; return 0;
...@@ -327,7 +327,7 @@ static int soc_tplg_dai_link_load(struct soc_tplg *tplg, ...@@ -327,7 +327,7 @@ static int soc_tplg_dai_link_load(struct soc_tplg *tplg,
/* tell the component driver that all firmware has been loaded in this request */ /* tell the component driver that all firmware has been loaded in this request */
static void soc_tplg_complete(struct soc_tplg *tplg) static void soc_tplg_complete(struct soc_tplg *tplg)
{ {
if (tplg->comp && tplg->ops && tplg->ops->complete) if (tplg->ops && tplg->ops->complete)
tplg->ops->complete(tplg->comp); tplg->ops->complete(tplg->comp);
} }
...@@ -684,7 +684,7 @@ EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_bind_event); ...@@ -684,7 +684,7 @@ EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_bind_event);
static int soc_tplg_init_kcontrol(struct soc_tplg *tplg, static int soc_tplg_init_kcontrol(struct soc_tplg *tplg,
struct snd_kcontrol_new *k, struct snd_soc_tplg_ctl_hdr *hdr) struct snd_kcontrol_new *k, struct snd_soc_tplg_ctl_hdr *hdr)
{ {
if (tplg->comp && tplg->ops && tplg->ops->control_load) if (tplg->ops && tplg->ops->control_load)
return tplg->ops->control_load(tplg->comp, tplg->index, k, return tplg->ops->control_load(tplg->comp, tplg->index, k,
hdr); hdr);
...@@ -1174,7 +1174,7 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, ...@@ -1174,7 +1174,7 @@ static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg,
static int soc_tplg_add_route(struct soc_tplg *tplg, static int soc_tplg_add_route(struct soc_tplg *tplg,
struct snd_soc_dapm_route *route) struct snd_soc_dapm_route *route)
{ {
if (tplg->comp && tplg->ops && tplg->ops->dapm_route_load) if (tplg->ops && tplg->ops->dapm_route_load)
return tplg->ops->dapm_route_load(tplg->comp, tplg->index, return tplg->ops->dapm_route_load(tplg->comp, tplg->index,
route); route);
...@@ -2563,7 +2563,7 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg, ...@@ -2563,7 +2563,7 @@ static int soc_tplg_manifest_load(struct soc_tplg *tplg,
} }
/* pass control to component driver for optional further init */ /* pass control to component driver for optional further init */
if (tplg->comp && tplg->ops && tplg->ops->manifest) if (tplg->ops && tplg->ops->manifest)
ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest); ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest);
if (!abi_match) /* free the duplicated one */ if (!abi_match) /* free the duplicated one */
...@@ -2735,6 +2735,10 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp, ...@@ -2735,6 +2735,10 @@ int snd_soc_tplg_component_load(struct snd_soc_component *comp,
struct soc_tplg tplg; struct soc_tplg tplg;
int ret; int ret;
/* component needs to exist to keep and reference data while parsing */
if (!comp)
return -EINVAL;
/* setup parsing context */ /* setup parsing context */
memset(&tplg, 0, sizeof(tplg)); memset(&tplg, 0, sizeof(tplg));
tplg.fw = fw; tplg.fw = fw;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment