Commit f9d20283 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: rawmidi - Fix possible race in open

The module refcount should be handled in the register_mutex to avoid
possible races with module unloading.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent fec6c6fe
...@@ -237,15 +237,16 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, ...@@ -237,15 +237,16 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
rfile->input = rfile->output = NULL; rfile->input = rfile->output = NULL;
mutex_lock(&register_mutex); mutex_lock(&register_mutex);
rmidi = snd_rawmidi_search(card, device); rmidi = snd_rawmidi_search(card, device);
mutex_unlock(&register_mutex);
if (rmidi == NULL) { if (rmidi == NULL) {
err = -ENODEV; mutex_unlock(&register_mutex);
goto __error1; return -ENODEV;
} }
if (!try_module_get(rmidi->card->module)) { if (!try_module_get(rmidi->card->module)) {
err = -EFAULT; mutex_unlock(&register_mutex);
goto __error1; return -ENXIO;
} }
mutex_unlock(&register_mutex);
if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK))
mutex_lock(&rmidi->open_mutex); mutex_lock(&rmidi->open_mutex);
if (mode & SNDRV_RAWMIDI_LFLG_INPUT) { if (mode & SNDRV_RAWMIDI_LFLG_INPUT) {
...@@ -370,10 +371,9 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice, ...@@ -370,10 +371,9 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
snd_rawmidi_runtime_free(sinput); snd_rawmidi_runtime_free(sinput);
if (output != NULL) if (output != NULL)
snd_rawmidi_runtime_free(soutput); snd_rawmidi_runtime_free(soutput);
module_put(rmidi->card->module);
if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK)) if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK))
mutex_unlock(&rmidi->open_mutex); mutex_unlock(&rmidi->open_mutex);
__error1: module_put(rmidi->card->module);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment