diff mbox series

ALSA: emu10k1: fix capture interrupt handler unlinking

Message ID 20230405201220.2197923-1-oswald.buddenhagen@gmx.de (mailing list archive)
State New, archived
Headers show
Series ALSA: emu10k1: fix capture interrupt handler unlinking | expand

Commit Message

Oswald Buddenhagen April 5, 2023, 8:12 p.m. UTC
Due to two copy/pastos, closing the MIC or EFX capture device would
make a running ADC capture hang due to unsetting its interrupt handler.
In principle, this would have also allowed dereferencing dangling
pointers, but we're actually rather thorough at disabling and flushing
the ints.

While it may sound like one, this actually wasn't a hypothetical bug:
PortAudio will open a capture stream at startup (and close it right
away) even if not asked to. If the first device is busy, it will just
proceed with the next one ... thus killing a concurrent capture.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
---
 sound/pci/emu10k1/emupcm.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Takashi Iwai April 6, 2023, 6:12 a.m. UTC | #1
On Wed, 05 Apr 2023 22:12:20 +0200,
Oswald Buddenhagen wrote:
> 
> Due to two copy/pastos, closing the MIC or EFX capture device would
> make a running ADC capture hang due to unsetting its interrupt handler.
> In principle, this would have also allowed dereferencing dangling
> pointers, but we're actually rather thorough at disabling and flushing
> the ints.
> 
> While it may sound like one, this actually wasn't a hypothetical bug:
> PortAudio will open a capture stream at startup (and close it right
> away) even if not asked to. If the first device is busy, it will just
> proceed with the next one ... thus killing a concurrent capture.
> 
> Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>

Applied, thanks.


Takashi
diff mbox series

Patch

diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 48af77ae8020..908f76f1bb9f 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -1236,7 +1236,7 @@  static int snd_emu10k1_capture_mic_close(struct snd_pcm_substream *substream)
 {
 	struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
 
-	emu->capture_interrupt = NULL;
+	emu->capture_mic_interrupt = NULL;
 	emu->pcm_capture_mic_substream = NULL;
 	return 0;
 }
@@ -1344,7 +1344,7 @@  static int snd_emu10k1_capture_efx_close(struct snd_pcm_substream *substream)
 {
 	struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
 
-	emu->capture_interrupt = NULL;
+	emu->capture_efx_interrupt = NULL;
 	emu->pcm_capture_efx_substream = NULL;
 	return 0;
 }