linux-stable/sound
Takashi Iwai b6f7b2c1ac ALSA: info: Fix potential deadlock at disconnection
commit c7a6065195 upstream.

As reported recently, ALSA core info helper may cause a deadlock at
the forced device disconnection during the procfs operation.

The proc_remove() (that is called from the snd_card_disconnect()
helper) has a synchronization of the pending procfs accesses via
wait_for_completion().  Meanwhile, ALSA procfs helper takes the global
mutex_lock(&info_mutex) at both the proc_open callback and
snd_card_info_disconnect() helper.  Since the proc_open can't finish
due to the mutex lock, wait_for_completion() never returns, either,
hence it deadlocks.

	TASK#1				TASK#2
	proc_reg_open()
	  takes use_pde()
	snd_info_text_entry_open()
					snd_card_disconnect()
					snd_info_card_disconnect()
					  takes mutex_lock(&info_mutex)
					proc_remove()
					wait_for_completion(unused_pde)
					  ... waiting task#1 closes
	mutex_lock(&info_mutex)
		=> DEADLOCK

This patch is a workaround for avoiding the deadlock scenario above.

The basic strategy is to move proc_remove() call outside the mutex
lock.  proc_remove() can work gracefully without extra locking, and it
can delete the tree recursively alone.  So, we call proc_remove() at
snd_info_card_disconnection() at first, then delete the rest resources
recursively within the info_mutex lock.

After the change, the function snd_info_disconnect() doesn't do
disconnection by itself any longer, but it merely clears the procfs
pointer.  So rename the function to snd_info_clear_entries() for
avoiding confusion.

The similar change is applied to snd_info_free_entry(), too.  Since
the proc_remove() is called only conditionally with the non-NULL
entry->p, it's skipped after the snd_info_clear_entries() call.

Reported-by: Shinhyung Kang <s47.kang@samsung.com>
Closes: https://lore.kernel.org/r/664457955.21699345385931.JavaMail.epsvc@epcpadp4
Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20231109141954.4283-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-11-28 16:45:45 +00:00
..
aoa ALSA: aoa: Fix I2S device accounting 2022-11-03 23:50:57 +09:00
arm
atmel
core ALSA: info: Fix potential deadlock at disconnection 2023-11-28 16:45:45 +00:00
drivers ALSA: mts64: fix possible null-ptr-defer in snd_mts64_interrupt 2023-01-18 09:26:16 +01:00
firewire ALSA: fireworks: fix wrong return count shorter than expected by 4 bytes 2022-05-12 12:17:09 +02:00
hda ALSA: hda: Fix possible null-ptr-deref when assigning a stream 2023-11-28 16:45:43 +00:00
i2c ALSA: i2c/cs8427: fix iec958 mixer control deactivation 2023-04-20 12:02:11 +02:00
isa treewide: Remove uninitialized_var() usage 2023-08-11 11:33:32 +02:00
mips
oss
parisc
pci ALSA: ac97: Fix possible error value of *rac97 2023-09-23 10:46:56 +02:00
pcmcia ALSA: vxpocket: Fix invalid endian conversions 2018-08-22 07:46:10 +02:00
ppc ALSA: ppc: fix error return code in snd_pmac_probe() 2021-07-20 16:17:50 +02:00
sh ALSA: sh: Fix compile warning wrt const 2020-02-28 16:36:02 +01:00
soc ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails 2023-11-20 10:27:34 +01:00
sparc ALSA: sparc: Fix invalid snd_free_pages() at error path 2018-12-05 19:41:24 +01:00
spi ALSA: spi: Add check for clk_enable() 2022-04-20 09:08:14 +02:00
synth ALSA: emux: Avoid potential array out-of-bound in snd_emux_xg_control() 2023-02-22 12:46:04 +01:00
usb ALSA: usb-audio: Add support for Mythware XA001AU capture and playback interfaces. 2023-08-30 16:35:12 +02:00
x86 ALSA: intel_hdmi: Fix reference to PCM buffer address 2022-03-08 19:01:56 +01:00
ac97_bus.c
Kconfig
last.c
Makefile
sound_core.c sound: fix a memory leak bug 2019-08-16 10:13:46 +02:00