ALSA: seq: Fix race at closing in virmidi driver
[firefly-linux-kernel-4.4.55.git] / sound / core / seq / seq_virmidi.c
index 09b26cb8265a1d4d9a7d952f8d552333c03395aa..81134e067184f36bdbd2abc0bb3f64354888a7d4 100644 (file)
@@ -261,9 +261,13 @@ static int snd_virmidi_output_open(struct snd_rawmidi_substream *substream)
  */
 static int snd_virmidi_input_close(struct snd_rawmidi_substream *substream)
 {
+       struct snd_virmidi_dev *rdev = substream->rmidi->private_data;
        struct snd_virmidi *vmidi = substream->runtime->private_data;
-       snd_midi_event_free(vmidi->parser);
+
+       write_lock_irq(&rdev->filelist_lock);
        list_del(&vmidi->list);
+       write_unlock_irq(&rdev->filelist_lock);
+       snd_midi_event_free(vmidi->parser);
        substream->runtime->private_data = NULL;
        kfree(vmidi);
        return 0;