diff options
author | Mark Hills <mark@xwax.org> | 2020-07-08 11:18:46 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2020-07-09 12:58:51 +0200 |
commit | 6c331254487306a633a3d8636ca78eb77a73906a (patch) | |
tree | fb392b866842fd7a529805e52538677aac0060a3 | |
parent | 027c70021b905eb23e2f36c64add062ba218b841 (diff) |
ALSA: echoaudio: Prevent races in calls to set_audio_format()
The function uses chip->comm_page which needs locking against
other use at the same time.
Signed-off-by: Mark Hills <mark@xwax.org>
Link: https://lore.kernel.org/r/20200708101848.3457-3-mark@xwax.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r-- | sound/pci/echoaudio/echoaudio.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sound/pci/echoaudio/echoaudio.c b/sound/pci/echoaudio/echoaudio.c index f2bc37c144d6..c97928e7e56b 100644 --- a/sound/pci/echoaudio/echoaudio.c +++ b/sound/pci/echoaudio/echoaudio.c @@ -711,9 +711,22 @@ static int pcm_prepare(struct snd_pcm_substream *substream) if (snd_BUG_ON(pipe_index >= px_num(chip))) return -EINVAL; - if (snd_BUG_ON(!is_pipe_allocated(chip, pipe_index))) + + /* + * We passed checks we can do independently; now take + * exclusive control + */ + + spin_lock_irq(&chip->lock); + + if (snd_BUG_ON(!is_pipe_allocated(chip, pipe_index))) { + spin_unlock(&chip->lock); return -EINVAL; + } + set_audio_format(chip, pipe_index, &format); + spin_unlock_irq(&chip->lock); + return 0; } |