]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
ALSA: seq: oss: Avoid mutex lock for a long-time ioctl
authorTakashi Iwai <tiwai@suse.de>
Tue, 22 Sep 2020 08:38:56 +0000 (10:38 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 08:55:11 +0000 (09:55 +0100)
[ Upstream commit 2759caad2600d503c3b0ed800e7e03d2cd7a4c05 ]

Recently we applied a fix to cover the whole OSS sequencer ioctls with
the mutex for dealing with the possible races.  This works fine in
general, but in theory, this may lead to unexpectedly long stall if an
ioctl like SNDCTL_SEQ_SYNC is issued and an event with the far future
timestamp was queued.

For fixing such a potential stall, this patch changes the mutex lock
applied conditionally excluding such an ioctl command.  Also, change
the mutex_lock() with the interruptible version for user to allow
escaping from the big-hammer mutex.

Fixes: 80982c7e834e ("ALSA: seq: oss: Serialize ioctls")
Suggested-by: Pavel Machek <pavel@ucw.cz>
Link: https://lore.kernel.org/r/20200922083856.28572-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/core/seq/oss/seq_oss.c

index ed5bca0db3e73ccb3bac1d0e208e378a2198de82..f4a9d9972330b8f34b221e6b02525acf72d4a245 100644 (file)
@@ -187,9 +187,12 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        if (snd_BUG_ON(!dp))
                return -ENXIO;
 
-       mutex_lock(&register_mutex);
+       if (cmd != SNDCTL_SEQ_SYNC &&
+           mutex_lock_interruptible(&register_mutex))
+               return -ERESTARTSYS;
        rc = snd_seq_oss_ioctl(dp, cmd, arg);
-       mutex_unlock(&register_mutex);
+       if (cmd != SNDCTL_SEQ_SYNC)
+               mutex_unlock(&register_mutex);
        return rc;
 }