]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
ASoC: Fix NULL dereference at freeing
authorTakashi Iwai <tiwai@suse.de>
Tue, 7 Jan 2020 07:09:56 +0000 (08:09 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 7 Jan 2020 22:27:44 +0000 (22:27 +0000)
When an ASoC driver with pcm_destruct component ops is freed before
the PCM object instantiation (e.g. deferring the probe), it hits an
Oops at snd_soc_pcm_component_free() that calls the pcm_destruct ops
unconditionally.

Fix it by adding a NULL-check of rtd->pcm before calling callbacks.

Fixes: c64bfc906600 ("ASoC: soc-core: add new pcm_construct/pcm_destruct")
Reported-by: Matthias Brugger <matthias.bgg@gmail.com>
Tested-by: Ben Ho <ben.ho@mediatek.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20200107070956.15807-1-tiwai@suse.de
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/soc-component.c

index 1590e805d016d8fcb04fbe7edfebfc04ca9893b8..6a8f26bf09ba44e246283739db93d0f19305f444 100644 (file)
@@ -520,6 +520,9 @@ void snd_soc_pcm_component_free(struct snd_soc_pcm_runtime *rtd)
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_component *component;
 
+       if (!rtd->pcm)
+               return;
+
        for_each_rtd_components(rtd, rtdcom, component)
                if (component->driver->pcm_destruct)
                        component->driver->pcm_destruct(component, rtd->pcm);