linux/sound/pci
Takashi Iwai ec085da343 ALSA: hda: Fix potential deadlock at codec unbinding
[ Upstream commit 7206998f57 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-01-27 11:04:05 +01:00
..
ac97 ALSA: ac97: Fix assignment in if condition 2021-06-09 17:30:02 +02:00
ali5451 ALSA: ali5451: Allocate resources with device-managed APIs 2021-07-19 16:17:00 +02:00
asihpi ALSA: asihpi: fix comment syntax in file headers 2021-03-18 10:13:25 +01:00
au88x0 ALSA: au88x0: Allocate resources with device-managed APIs 2021-07-19 16:16:51 +02:00
aw2 ALSA: aw2: Allocate resources with device-managed APIs 2021-07-19 16:16:52 +02:00
ca0106 ALSA: ca0106: Allocate resources with device-managed APIs 2021-07-19 16:16:53 +02:00
cs46xx ALSA: pci: cs46xx: Fix set up buffer type properly 2021-08-09 10:04:05 +02:00
cs5535audio ALSA: cs5535audio: Allocate resources with device-managed APIs 2021-07-19 16:16:55 +02:00
ctxfi ALSA: ctxfi: Fix out-of-range access 2021-12-01 09:04:40 +01:00
echoaudio ALSA: echoaudio: Allocate resources with device-managed APIs 2021-07-19 16:16:55 +02:00
emu10k1 ALSA: emu10k1x: Allocate resources with device-managed APIs 2021-07-19 16:16:58 +02:00
hda ALSA: hda: Fix potential deadlock at codec unbinding 2022-01-27 11:04:05 +01:00
ice1712 ALSA: ice1724: Allocate resources with device-managed APIs 2021-07-19 16:17:00 +02:00
korg1212 ALSA: pci/korg1212: completely remove 'set but not used' warnings 2021-08-05 08:23:38 +02:00
lola ALSA: lola: Allocate resources with device-managed APIs 2021-07-19 16:17:02 +02:00
lx6464es ALSA: lx6464es: Allocate resources with device-managed APIs 2021-07-19 16:17:03 +02:00
mixart ALSA: mixart: Fix assignment in if condition 2021-06-09 17:30:15 +02:00
nm256 ALSA: nm256: Fix error return code in snd_nm256_create() 2021-07-20 16:08:21 +02:00
oxygen ALSA: oxygen: Allocate resources with device-managed APIs 2021-07-19 16:17:04 +02:00
pcxhr ALSA: pcxhr: "fix" PCXHR_REG_TO_PORT definition 2021-09-16 11:09:04 +02:00
riptide ALSA: riptide: Allocate resources with device-managed APIs 2021-07-19 16:17:05 +02:00
rme9652 ALSA: pci: rme: Fix unaligned buffer addresses 2021-11-18 19:15:55 +01:00
trident ALSA: trident: Allocate resources with device-managed APIs 2021-07-19 16:17:08 +02:00
vx222 ALSA: vx222: fix null-ptr-deref 2021-09-07 07:13:19 +02:00
ymfpci ALSA: ymfpci: Allocate resources with device-managed APIs 2021-07-19 16:17:11 +02:00
ad1889.c ALSA: ad1889: Allocate resources with device-managed APIs 2021-07-19 16:16:38 +02:00
ad1889.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
ak4531_codec.c ALSA: ak4531: Fix assignment in if condition 2021-06-09 17:29:49 +02:00
als300.c ALSA: als300: Fix missing chip initialization 2021-07-21 00:31:56 +02:00
als4000.c ALSA: als4000: Allocate resources with device-managed APIs 2021-07-19 16:16:40 +02:00
atiixp_modem.c ALSA: atiixp: Allocate resources with device-managed APIs 2021-07-19 16:16:37 +02:00
atiixp.c ALSA: atiixp: Allocate resources with device-managed APIs 2021-07-19 16:16:37 +02:00
azt3328.c ALSA: azt3328: Allocate resources with device-managed APIs 2021-07-19 16:16:40 +02:00
azt3328.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
bt87x.c ALSA: bt87x: Allocate resources with device-managed APIs 2021-07-19 16:16:41 +02:00
cmipci.c ALSA: cmipci: Allocate resources with device-managed APIs 2021-07-19 16:16:42 +02:00
cs4281.c ALSA: cs4281: Fix missing chip initialization 2021-07-21 00:31:39 +02:00
cs5530.c ALSA: cs5530: Allocate resources with device-managed APIs 2021-07-19 16:16:43 +02:00
ens1370.c ALSA: ens137x: Allocate resources with device-managed APIs 2021-07-19 16:16:44 +02:00
ens1371.c
es1938.c ALSA: es1938: Allocate resources with device-managed APIs 2021-07-19 16:16:44 +02:00
es1968.c ALSA: es1968: Allocate resources with device-managed APIs 2021-07-19 16:16:45 +02:00
fm801.c ALSA: fm801: Allocate resources with device-managed APIs 2021-07-19 16:16:46 +02:00
intel8x0.c ALSA: memalloc: Correctly name as WC 2021-08-04 08:07:58 +02:00
intel8x0m.c ALSA: intel8x0: Allocate resources with device-managed APIs 2021-07-19 16:16:36 +02:00
Kconfig ALSA: ISA: not for M68K 2021-11-25 09:48:28 +01:00
maestro3.c ALSA: maestro3: Allocate resources with device-managed APIs 2021-07-19 16:16:46 +02:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
rme32.c ALSA: rme32: Allocate resources with device-managed APIs 2021-07-19 16:16:47 +02:00
rme96.c ALSA: rme96: Allocate resources with device-managed APIs 2021-07-19 16:16:48 +02:00
sis7019.c ALSA: sis7019: Allocate resources with device-managed APIs 2021-07-19 16:16:48 +02:00
sis7019.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 274 2019-06-05 17:30:30 +02:00
sonicvibes.c ALSA: sonicvibes: Allocate resources with device-managed APIs 2021-07-19 16:16:49 +02:00
via82xx_modem.c ALSA: via82xx: Allocate resources with device-managed APIs 2021-07-19 16:16:50 +02:00
via82xx.c ALSA: via82xx: Allocate resources with device-managed APIs 2021-07-19 16:16:50 +02:00