[alsa-devel] [PATCH] ASoC: damp: Reset dapm wcache after freeing damp widgets
If there is anything in damp->path_source_cache or damp->path_sink_cache, it can not be valid after the widgets have been freed. Without this patch a repeated remove and load of a machine driver may cause NULL pointer reference in dapm_wcache_lookup() when a freed widget, not belonging to any list, is haunting in the wcache.
Signed-off-by: Jyri Sarha jsarha@ti.com Reported-by: Felipe Balbi balbi@ti.com --- The patch fixes the problem reported here: http://mailman.alsa-project.org/pipermail/alsa-devel/2015-October/099431.htm...
sound/soc/soc-dapm.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index ff8bda4..d78db59 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -2286,6 +2286,9 @@ static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) continue; snd_soc_dapm_free_widget(w); } + + dapm->path_sink_cache.widget = NULL; + dapm->path_source_cache.widget = NULL; }
static struct snd_soc_dapm_widget *dapm_find_widget(
On Mon, Nov 09, 2015 at 03:30:26PM +0200, Jyri Sarha wrote:
If there is anything in damp->path_source_cache or damp->path_sink_cache, it can not be valid after the widgets have been freed. Without this patch a repeated remove and load of a machine driver may cause NULL pointer reference in dapm_wcache_lookup() when a freed widget, not belonging to any list, is haunting in the wcache.
Signed-off-by: Jyri Sarha jsarha@ti.com Reported-by: Felipe Balbi balbi@ti.com
Acked-by: Charles Keepax ckeepax@opensource.wolfsonmicro.com
Thanks, Charles
On 11/09/2015 02:30 PM, Jyri Sarha wrote: [...]
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index ff8bda4..d78db59 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -2286,6 +2286,9 @@ static void dapm_free_widgets(struct snd_soc_dapm_context *dapm) continue; snd_soc_dapm_free_widget(w); }
- dapm->path_sink_cache.widget = NULL;
- dapm->path_source_cache.widget = NULL;
}
Looks good, but this is not the only place where we free widgets. Can you add a helper function snd_soc_dapm_reset_cache() (or similar) and then call this from dapm_free_widgets() as well as snd_soc_tplg_widget_remove_all().
- Lars
participants (3)
-
Charles Keepax
-
Jyri Sarha
-
Lars-Peter Clausen