linux/sound/core/seq
John Keeping 403f7f3ad3 ALSA: seq: midi: Serialize input teardown with event_input
snd_midi_input_event() must not be running while a rawmidi substream is
closing, since this can lead to the trigger state becoming out-of-step
through this sequence in snd_rawmidi_input_trigger():

	snd_rawmidi_input_trigger(up=0)
					snd_midi_input_event()
					 -> snd_rawmidi_kernel_read()
					     -> snd_rawmidi_input_trigger(up=1)
	  -> cancel_work_sync()

which ends with the underlying device being active unexpectedly.

When this is called from close_substream(), further input can re-trigger
the input event leaving it running after rawmidi_release_priv() has set
rfile->rmidi to NULL which leads to:

	Unable to handle kernel NULL pointer dereference at virtual address 00000000000000b0
	Call trace:
	 snd_midi_input_event+0x3c/0x134 [snd_seq_midi] (P)
	 snd_rawmidi_input_event_work+0x1c/0x2c
	 process_one_work+0x150/0x3a4
	 worker_thread+0x190/0x318

Apply a similar approach to commit ef7607ab1c ("ALSA: seq: midi:
Serialize output teardown with event_input") which fixed the same issue
in the output direction, but updated to use RCU following Takashi Iwai's
proposed follow-on patch [1].

With this change in place, midisynth_unsubscribe() clears the input file
so snd_midi_input_event() will not re-trigger the stream and will be
quiesced by the cancel_work_sync() in snd_rawmidi_input_trigger().

[1] https://lore.kernel.org/linux-sound/20260813144224.753399-1-tiwai@suse.de/

Fixes: 1da177e4c3 ("Linux-2.6.12-rc2")
Signed-off-by: John Keeping <jkeeping@inmusicbrands.com>
Link: https://patch.msgid.link/20260813150810.795393-1-jkeeping@inmusicbrands.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
2026-08-13 18:21:51 +02:00
..
oss ALSA: core: Clean up file_operations definitions 2026-07-13 12:01:27 +02:00
Kconfig ALSA: seq: Make dependency on UMP clearer 2025-01-01 13:56:48 +01:00
Makefile ALSA: core: Use *-y instead of *-objs in Makefile 2024-05-08 18:17:32 +02:00
seq_clientmgr.c ALSA: seq: Drop the dead struct snd_seq_event_bounce 2026-08-12 16:39:11 +02:00
seq_clientmgr.h ALSA: seq: Use RCU for the client port list 2026-08-10 17:44:34 +02:00
seq_compat.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
seq_dummy.c Merge branch 'for-linus' into for-next 2026-06-07 09:27:04 +02:00
seq_fifo.c ALSA: seq: avoid stale FIFO cells during resize 2026-06-14 10:57:10 +02:00
seq_fifo.h ALSA: seq: Clean up fifo locking with guard 2025-08-29 11:52:36 +02:00
seq_info.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
seq_info.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
seq_lock.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
seq_lock.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
seq_memory.c ALSA: seq: Fix uninitialised heap leak in snd_seq_event_dup() 2026-06-24 11:03:25 +02:00
seq_memory.h ALSA: seq: Add UMP support 2023-05-23 12:11:21 +02:00
seq_midi_emul.c ALSA: seq: Use flexible array for MIDI channels 2026-05-15 08:52:44 +02:00
seq_midi_event.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
seq_midi.c ALSA: seq: midi: Serialize input teardown with event_input 2026-08-13 18:21:51 +02:00
seq_ports.c ALSA: seq: Use RCU for the client port list 2026-08-10 17:44:34 +02:00
seq_ports.h ALSA: seq: Use RCU for the port subscriber list 2026-08-10 17:44:34 +02:00
seq_prioq.c ALSA: seq: Remove arbitrary prioq insertion limit 2026-05-26 07:54:36 +02:00
seq_prioq.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
seq_queue.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
seq_queue.h ALSA: seq: Clean up queue locking with auto cleanup 2025-08-29 11:52:35 +02:00
seq_system.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
seq_system.h ALSA: seq: Notify UMP EP and FB changes 2025-01-12 13:12:21 +01:00
seq_timer.c ALSA: seq: Fix division by zero in initialize_timer() 2026-07-25 08:53:34 +02:00
seq_timer.h ALSA: seq: Remove unused declarations 2024-08-17 16:32:31 +02:00
seq_ump_client.c ALSA: seq: Use RCU for the UMP client output substream 2026-08-10 17:44:34 +02:00
seq_ump_convert.c ALSA: core/seq: Optimize the return logic in cc_ev_to_ump_midi2 2026-03-27 14:40:24 +01:00
seq_ump_convert.h ALSA: seq: Fix delivery of UMP events to group ports 2025-05-11 15:58:06 +02:00
seq_virmidi.c ALSA: seq: Use RCU for the virmidi file list 2026-08-10 17:44:34 +02:00
seq.c treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00