ASoC: Intel: Skylake: Initialize lists before access so they are safe to use
If skl_probe_work() was not run driver ends up dereferencing NULL pointer when operating on lists in skl_platform_unregister(). To fix this initialize lists in skl_create(). Also run cancel_work_sync() before all cleanup functions, so we don't end up unnecessarily running probe work. Easily reproducible with: while true; do modprobe snd_soc_skl; rmmod snd_soc_skl; done (with the assumption that relevant drivers are added to blacklist on system boot) Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
@@ -438,7 +438,6 @@ static int skl_free(struct hdac_bus *bus)
|
||||
|
||||
snd_hdac_ext_bus_exit(bus);
|
||||
|
||||
cancel_work_sync(&skl->probe_work);
|
||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
snd_hdac_i915_exit(bus);
|
||||
@@ -867,6 +866,9 @@ static int skl_create(struct pci_dev *pci,
|
||||
hbus = skl_to_hbus(skl);
|
||||
bus = skl_to_bus(skl);
|
||||
|
||||
INIT_LIST_HEAD(&skl->ppl_list);
|
||||
INIT_LIST_HEAD(&skl->bind_list);
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
|
||||
ext_ops = snd_soc_hdac_hda_get_ops();
|
||||
#endif
|
||||
@@ -1116,6 +1118,7 @@ static void skl_remove(struct pci_dev *pci)
|
||||
struct hdac_bus *bus = pci_get_drvdata(pci);
|
||||
struct skl *skl = bus_to_skl(bus);
|
||||
|
||||
cancel_work_sync(&skl->probe_work);
|
||||
release_firmware(skl->tplg);
|
||||
|
||||
pm_runtime_get_noresume(&pci->dev);
|
||||
|
Reference in New Issue
Block a user