ASoC: topology: Check widget kcontrols before deref.
authorLiam Girdwood <liam.r.girdwood@linux.intel.com>
Wed, 14 Mar 2018 20:42:40 +0000 (20:42 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 19 Mar 2018 07:12:54 +0000 (15:12 +0800)
Validate the topology input before we dereference the pointer.

Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-topology.c

index e81b52600d58464e90fb03cbc44d11f1628d27fd..b363f2409f727083fd7298fa0fd0e9ac79b9ecdf 100644 (file)
@@ -504,6 +504,9 @@ static void remove_widget(struct snd_soc_component *comp,
        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.
@@ -524,7 +527,6 @@ static void remove_widget(struct snd_soc_component *comp,
 
                        kfree(se);
                }
-               kfree(w->kcontrol_news);
        } else {
                /* volume mixer or bytes controls */
                for (i = 0; i < w->num_kcontrols; i++) {
@@ -541,8 +543,11 @@ static void remove_widget(struct snd_soc_component *comp,
                        kfree((void *)kcontrol->private_value);
                        snd_ctl_remove(card, kcontrol);
                }
-               kfree(w->kcontrol_news);
        }
+
+free_news:
+       kfree(w->kcontrol_news);
+
        /* widget w is freed by soc-dapm.c */
 }