Skip to content

Commit

Permalink
ASoC: SOF: core: fix error handling with the probe workqueue
Browse files Browse the repository at this point in the history
BugLink: https://bugs.launchpad.net/bugs/1826181

In some configurations, it's a requirement to split the probe in two,
with a second part handled in a workqueue (e.g. for HDMI support
which depends on the DRM modules).

SOF already handles these configurations but the error flow is
incorrect. When an error occurs in the workqueue, the probe has
technically already completed. If we release the resources on errors,
this generates kernel oops/use-after-free when the resources are
released a second time on module removal.

GitHub issue: thesofproject/linux#945
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
(cherry picked from commit cbdcbcd38cc6f420241ed8e781e98605836e5c95
git://github.com/thesofproject/linux.git)
Signed-off-by: Hui Wang <hui.wang@canonical.com>
Signed-off-by: Timo Aaltonen <timo.aaltonen@canonical.com>
  • Loading branch information
plbossart authored and tjaalton committed Jun 18, 2019
1 parent 747b507 commit 956c9f5
Showing 1 changed file with 16 additions and 0 deletions.
16 changes: 16 additions & 0 deletions sound/soc/sof/core.c
Expand Up @@ -391,6 +391,7 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)

return 0;

#if !IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)
fw_run_err:
snd_sof_fw_unload(sdev);
fw_load_err:
Expand All @@ -399,6 +400,21 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
snd_sof_free_debug(sdev);
dbg_err:
snd_sof_remove(sdev);
#else

/*
* when the probe_continue is handled in a work queue, the
* probe does not fail so we don't release resources here.
* They will be released with an explicit call to
* snd_sof_device_remove() when the PCI/ACPI device is removed
*/

fw_run_err:
fw_load_err:
ipc_err:
dbg_err:

#endif

return ret;
}
Expand Down

0 comments on commit 956c9f5

Please sign in to comment.