diff mbox

ASoC: damp: Reset dapm wcache after freeing damp widgets

Message ID 1447075826-641-1-git-send-email-jsarha@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jyri Sarha Nov. 9, 2015, 1:30 p.m. UTC
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.html

 sound/soc/soc-dapm.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Charles Keepax Nov. 10, 2015, 10:37 a.m. UTC | #1
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
Lars-Peter Clausen Nov. 10, 2015, 11:31 a.m. UTC | #2
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
diff mbox

Patch

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(