mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 22:21:42 +00:00
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:
parent
d5fcaaba54
commit
776cb3b80e
@ -1498,9 +1498,6 @@ int skl_platform_register(struct device *dev)
|
||||
struct hdac_bus *bus = dev_get_drvdata(dev);
|
||||
struct skl *skl = bus_to_skl(bus);
|
||||
|
||||
INIT_LIST_HEAD(&skl->ppl_list);
|
||||
INIT_LIST_HEAD(&skl->bind_list);
|
||||
|
||||
skl->dais = kmemdup(skl_platform_dai, sizeof(skl_platform_dai),
|
||||
GFP_KERNEL);
|
||||
if (!skl->dais) {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user