[PATCH] ASoC: topology: Perform component check upfront
Sridharan, Ranjani
ranjani.sridharan at intel.com
Thu Mar 12 14:57:51 CET 2020
On Thu, Mar 12, 2020 at 3:14 AM Amadeusz Sławiński <
amadeuszx.slawinski at linux.intel.com> wrote:
> 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: Amadeusz Sławiński <amadeuszx.slawinski at linux.intel.com>
> ---
> sound/soc/soc-topology.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
> index 575da6aba807..66958c57d884 100644
> --- a/sound/soc/soc-topology.c
> +++ b/sound/soc/soc-topology.c
> @@ -251,7 +251,7 @@ static int soc_tplg_vendor_load_(struct soc_tplg *tplg,
> {
> 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);
> else {
> 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,
> static int soc_tplg_widget_load(struct soc_tplg *tplg,
> 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,
> tplg_w);
>
> @@ -295,7 +295,7 @@ static int soc_tplg_widget_load(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)
> {
> - 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,
> tplg_w);
>
> @@ -307,7 +307,7 @@ static int soc_tplg_dai_load(struct soc_tplg *tplg,
> struct snd_soc_dai_driver *dai_drv,
> 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,
> pcm, dai);
>
> @@ -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,
> 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 0;
> @@ -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 */
> 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);
> }
>
> @@ -684,7 +684,7 @@ EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_bind_event);
> static int soc_tplg_init_kcontrol(struct soc_tplg *tplg,
> 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,
> hdr);
>
> @@ -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,
> 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,
> route);
>
> @@ -2564,7 +2564,7 @@ static int soc_tplg_manifest_load(struct soc_tplg
> *tplg,
> }
>
> /* 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);
>
> if (!abi_match) /* free the duplicated one */
> @@ -2736,6 +2736,10 @@ int snd_soc_tplg_component_load(struct
> snd_soc_component *comp,
> struct soc_tplg tplg;
> int ret;
>
> + /* component needs to exist to keep and reference data while
> parsing */
> + if (!comp)
> + return -EINVAL;
> +
Amadeusz,
Thanks for this change. I agree that the checks for tplg->comp in the above
functions should be removed but is the check here really necessary at all?
snd_soc_tplg_component_load() is typically called when a component is
probed. Can it ever be null at all if it is getting probed?
Thanks,
Ranjani
More information about the Alsa-devel
mailing list