Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9d20283 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

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
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -237,15 +237,16 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
		rfile->input = rfile->output = NULL;
	mutex_lock(&register_mutex);
	rmidi = snd_rawmidi_search(card, device);
	mutex_unlock(&register_mutex);
	if (rmidi == NULL) {
		err = -ENODEV;
		goto __error1;
		mutex_unlock(&register_mutex);
		return -ENODEV;
	}
	if (!try_module_get(rmidi->card->module)) {
		err = -EFAULT;
		goto __error1;
		mutex_unlock(&register_mutex);
		return -ENXIO;
	}
	mutex_unlock(&register_mutex);

	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK))
		mutex_lock(&rmidi->open_mutex);
	if (mode & SNDRV_RAWMIDI_LFLG_INPUT) {
@@ -370,10 +371,9 @@ int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
		snd_rawmidi_runtime_free(sinput);
	if (output != NULL)
		snd_rawmidi_runtime_free(soutput);
	module_put(rmidi->card->module);
	if (!(mode & SNDRV_RAWMIDI_LFLG_NOOPENLOCK))
		mutex_unlock(&rmidi->open_mutex);
      __error1:
	module_put(rmidi->card->module);
	return err;
}