| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 24 Apr 2018 07:26:59 +0200 |
| Subject: ALSA: seq: oss: Fix unbalanced use lock for synth MIDI device |
| |
| commit f5e94b4c6ebdabe0f602d796e0430180927521a0 upstream. |
| |
| When get_synthdev() is called for a MIDI device, it returns the fixed |
| midi_synth_dev without the use refcounting. OTOH, the caller is |
| supposed to unreference unconditionally after the usage, so this would |
| lead to unbalanced refcount. |
| |
| This patch corrects the behavior and keep up the refcount balance also |
| for the MIDI synth device. |
| |
| Signed-off-by: Takashi Iwai <tiwai@suse.de> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| sound/core/seq/oss/seq_oss_synth.c | 12 ++++++++---- |
| 1 file changed, 8 insertions(+), 4 deletions(-) |
| |
| --- a/sound/core/seq/oss/seq_oss_synth.c |
| +++ b/sound/core/seq/oss/seq_oss_synth.c |
| @@ -363,10 +363,14 @@ get_synthdev(struct seq_oss_devinfo *dp, |
| return NULL; |
| if (! dp->synths[dev].opened) |
| return NULL; |
| - if (dp->synths[dev].is_midi) |
| - return &midi_synth_dev; |
| - if ((rec = get_sdev(dev)) == NULL) |
| - return NULL; |
| + if (dp->synths[dev].is_midi) { |
| + rec = &midi_synth_dev; |
| + snd_use_lock_use(&rec->use_lock); |
| + } else { |
| + rec = get_sdev(dev); |
| + if (!rec) |
| + return NULL; |
| + } |
| if (! rec->opened) { |
| snd_use_lock_free(&rec->use_lock); |
| return NULL; |