mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-18 02:46:06 +00:00
ASoC: dapm: 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> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
bb9a13a020
commit
fd589a1be2
@ -398,6 +398,7 @@ int snd_soc_dapm_del_routes(struct snd_soc_dapm_context *dapm,
|
||||
int snd_soc_dapm_weak_routes(struct snd_soc_dapm_context *dapm,
|
||||
const struct snd_soc_dapm_route *route, int num);
|
||||
void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w);
|
||||
void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm);
|
||||
|
||||
/* dapm events */
|
||||
void snd_soc_dapm_stream_event(struct snd_soc_pcm_runtime *rtd, int stream,
|
||||
|
@ -2293,6 +2293,12 @@ void snd_soc_dapm_free_widget(struct snd_soc_dapm_widget *w)
|
||||
kfree(w);
|
||||
}
|
||||
|
||||
void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
dapm->path_sink_cache.widget = NULL;
|
||||
dapm->path_source_cache.widget = NULL;
|
||||
}
|
||||
|
||||
/* free all dapm widgets and resources */
|
||||
static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
|
||||
{
|
||||
@ -2303,6 +2309,7 @@ static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
|
||||
continue;
|
||||
snd_soc_dapm_free_widget(w);
|
||||
}
|
||||
snd_soc_dapm_reset_cache(dapm);
|
||||
}
|
||||
|
||||
static struct snd_soc_dapm_widget *dapm_find_widget(
|
||||
|
@ -1805,6 +1805,7 @@ void snd_soc_tplg_widget_remove_all(struct snd_soc_dapm_context *dapm,
|
||||
snd_soc_tplg_widget_remove(w);
|
||||
snd_soc_dapm_free_widget(w);
|
||||
}
|
||||
snd_soc_dapm_reset_cache(dapm);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_remove_all);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user