diff options
author | Giuliano Pochini <pochini@shiny.it> | 2006-11-06 05:42:00 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2007-01-09 03:06:13 -0500 |
commit | 5929546a96d55962bdcabae0c4e25dfcd9f1fda9 (patch) | |
tree | e3aa538bda1d3b836cf4c9e3a9784f8639aef642 | |
parent | 5b005a0126bc2a2be3ae2c333d56e91bd5e2d8a6 (diff) |
[ALSA] Fix potential NULL pointer dereference in echoaudio midi
Fix races between the timer handler and the close function.
Signed-off-by: Giuliano Pochini <pochini@shiny.it>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r-- | sound/pci/echoaudio/midi.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/sound/pci/echoaudio/midi.c b/sound/pci/echoaudio/midi.c index e31f0f11e3a8..91f5bff66d3f 100644 --- a/sound/pci/echoaudio/midi.c +++ b/sound/pci/echoaudio/midi.c | |||
@@ -213,7 +213,7 @@ static void snd_echo_midi_output_write(unsigned long data) | |||
213 | sent = bytes = 0; | 213 | sent = bytes = 0; |
214 | spin_lock_irqsave(&chip->lock, flags); | 214 | spin_lock_irqsave(&chip->lock, flags); |
215 | chip->midi_full = 0; | 215 | chip->midi_full = 0; |
216 | if (chip->midi_out && !snd_rawmidi_transmit_empty(chip->midi_out)) { | 216 | if (!snd_rawmidi_transmit_empty(chip->midi_out)) { |
217 | bytes = snd_rawmidi_transmit_peek(chip->midi_out, buf, | 217 | bytes = snd_rawmidi_transmit_peek(chip->midi_out, buf, |
218 | MIDI_OUT_BUFFER_SIZE - 1); | 218 | MIDI_OUT_BUFFER_SIZE - 1); |
219 | DE_MID(("Try to send %d bytes...\n", bytes)); | 219 | DE_MID(("Try to send %d bytes...\n", bytes)); |
@@ -264,9 +264,11 @@ static void snd_echo_midi_output_trigger(struct snd_rawmidi_substream *substream | |||
264 | } | 264 | } |
265 | } else { | 265 | } else { |
266 | if (chip->tinuse) { | 266 | if (chip->tinuse) { |
267 | del_timer(&chip->timer); | ||
268 | chip->tinuse = 0; | 267 | chip->tinuse = 0; |
268 | spin_unlock_irq(&chip->lock); | ||
269 | del_timer_sync(&chip->timer); | ||
269 | DE_MID(("Timer removed\n")); | 270 | DE_MID(("Timer removed\n")); |
271 | return; | ||
270 | } | 272 | } |
271 | } | 273 | } |
272 | spin_unlock_irq(&chip->lock); | 274 | spin_unlock_irq(&chip->lock); |