linux/sound/pci/hda
Takashi Iwai 7206998f57 ALSA: hda: Fix potential deadlock at codec unbinding
When a codec is unbound dynamically via sysfs while its stream is in
use, we may face a potential deadlock at the proc remove or a UAF.
This happens since the hda_pcm is managed by a linked list, as it
handles the hda_pcm object release via kref.

When a PCM is opened at the unbinding time, the release of hda_pcm
gets delayed and it ends up with the close of the PCM stream releasing
the associated hda_pcm object of its own.  The hda_pcm destructor
contains the PCM device release that includes the removal of procfs
entries.  And, this removal has the sync of the close of all in-use
files -- which would never finish because it's called from the PCM
file descriptor itself, i.e. it's trying to shoot its foot.

For addressing the deadlock above, this patch changes the way to
manage and release the hda_pcm object.  The kref of hda_pcm is
dropped, and instead a simple refcount is introduced in hda_codec for
keeping the track of the active PCM streams, and at each PCM open and
close, this refcount is adjusted accordingly.  At unbinding, the
driver calls snd_device_disconnect() for each PCM stream, then
synchronizes with the refcount finish, and finally releases the object
resources.

Fixes: bbbc7e8502 ("ALSA: hda - Allocate hda_pcm objects dynamically")
Link: https://lore.kernel.org/r/20211116072459.18930-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2021-11-16 08:31:02 +01:00
..
ca0132_regs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 32 2019-05-24 17:27:10 +02:00
hda_auto_parser.c ALSA: hda: Allow model option to specify PCI SSID alias 2021-08-23 10:59:13 +02:00
hda_auto_parser.h ALSA: hda/cirrus: Increase AUTO_CFG_MAX_INS from 8 to 18 2021-03-07 09:17:30 +01:00
hda_beep.c ALSA: Use fallthrough pseudo-keyword 2020-07-09 13:01:29 +02:00
hda_beep.h ALSA: hda - Use standard device registration for beep 2019-01-29 18:28:09 +01:00
hda_bind.c ALSA: hda: Fix potential deadlock at codec unbinding 2021-11-16 08:31:02 +01:00
hda_codec.c ALSA: hda: Fix potential deadlock at codec unbinding 2021-11-16 08:31:02 +01:00
hda_controller_trace.h
hda_controller.c ALSA: hda: intel: Allow repeatedly probing on codec configuration errors 2021-10-07 09:15:22 +02:00
hda_controller.h ALSA: hda: intel: Allow repeatedly probing on codec configuration errors 2021-10-07 09:15:22 +02:00
hda_eld.c ALSA: Convert strlcpy to strscpy when return value is unused 2021-01-08 09:30:05 +01:00
hda_generic.c Merge branch 'for-linus' into for-next 2021-08-17 09:46:27 +02:00
hda_generic.h ALSA: hda: Nuke unused reboot_notify callback 2021-08-14 08:39:38 +02:00
hda_hwdep.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 32 2019-05-24 17:27:10 +02:00
hda_intel_trace.h
hda_intel.c ALSA: hda: intel: More comprehensive PM runtime setup for controller driver 2021-11-15 10:22:15 +01:00
hda_intel.h ALSA: hda: intel: Allow repeatedly probing on codec configuration errors 2021-10-07 09:15:22 +02:00
hda_jack.c ALSA: add virtio sound driver 2021-03-07 09:16:24 +01:00
hda_jack.h ALSA: hda - bind headset buttons to the headphone jack 2021-03-05 15:18:24 +01:00
hda_local.h ALSA: hda: Fix potential deadlock at codec unbinding 2021-11-16 08:31:02 +01:00
hda_proc.c ALSA: hda/proc - print DP-MST connections 2020-12-08 20:04:33 +01:00
hda_sysfs.c ALSA: hda: Fix regressions on clear and reconfig sysfs 2020-12-10 19:55:35 +01:00
hda_tegra.c ALSA: hda: Add IRQ check for platform_get_irq() 2021-06-22 16:12:03 +02:00
hp_x360_helper.c ALSA: hda/realtek - Fixup for HP x360 laptops with B&O speakers 2018-05-29 22:33:37 +02:00
ideapad_s740_helper.c ALSA: hda/realtek: Add quirk for Lenovo Ideapad S740 2021-04-16 10:12:50 +02:00
Kconfig ALSA: hda/cirrus: Move CS8409 HDA bridge to separate module 2021-08-12 13:41:36 +02:00
Makefile ALSA: hda/cs8409: Move arrays of configuration to a new file 2021-08-12 13:41:39 +02:00
patch_analog.c ALSA: hda/analog - Sink ad198x_shutup() and shuffle CONFIG_PM guards 2021-08-18 07:51:09 +02:00
patch_ca0110.c ALSA: hda: Unify get_response handling 2019-12-13 14:36:52 +01:00
patch_ca0132.c ALSA: hda: Nuke unused reboot_notify callback 2021-08-14 08:39:38 +02:00
patch_cirrus.c ALSA: hda/cirrus: Move CS8409 HDA bridge to separate module 2021-08-12 13:41:36 +02:00
patch_cmedia.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 32 2019-05-24 17:27:10 +02:00
patch_conexant.c ALSA: hda: Nuke unused reboot_notify callback 2021-08-14 08:39:38 +02:00
patch_cs8409-tables.c ALSA: hda/cs8409: Unmute/Mute codec when stream starts/stops 2021-08-12 13:42:01 +02:00
patch_cs8409.c ALSA: hda/cs8409: Setup Dolphin Headset Mic as Phantom Jack 2021-09-16 12:24:46 +02:00
patch_cs8409.h ALSA: hda/cs8409: Ensure Type Detection is only run on startup when necessary 2021-08-27 22:35:34 +02:00
patch_hdmi.c Merge branch 'for-linus' into for-next 2021-08-02 09:04:48 +02:00
patch_realtek.c ALSA: hda/realtek: Add quirk for HP EliteBook 840 G7 mute LED 2021-11-10 15:44:18 +01:00
patch_si3054.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 32 2019-05-24 17:27:10 +02:00
patch_sigmatel.c ALSA: hda/sigmatel - Sink stac_shutup() into stac_suspend() 2021-08-18 07:51:02 +02:00
patch_via.c ALSA: hda/via: Apply runtime PM workaround for ASUS B23E 2021-08-17 08:02:44 +02:00
thinkpad_helper.c ALSA: HDA - remove the custom implementation for the audio LED trigger 2021-03-30 15:35:15 +02:00