summaryrefslogtreecommitdiffstats
path: root/sound/core/seq/seq_fifo.c
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2017-03-21 13:56:04 +0100
committerTakashi Iwai <tiwai@suse.de>2017-03-21 14:01:10 +0100
commitc520ff3d03f0b5db7146d9beed6373ad5d2a5e0e (patch)
treeded14dbde99a6392416d92153ebfa248a2493616 /sound/core/seq/seq_fifo.c
parentc6736a94d0e527ddc0d1eb99dbc59886a9ecf471 (diff)
downloadlinux-c520ff3d03f0b5db7146d9beed6373ad5d2a5e0e.tar.gz
linux-c520ff3d03f0b5db7146d9beed6373ad5d2a5e0e.tar.bz2
linux-c520ff3d03f0b5db7146d9beed6373ad5d2a5e0e.zip
ALSA: seq: Fix racy cell insertions during snd_seq_pool_done()
When snd_seq_pool_done() is called, it marks the closing flag to refuse the further cell insertions. But snd_seq_pool_done() itself doesn't clear the cells but just waits until all cells are cleared by the caller side. That is, it's racy, and this leads to the endless stall as syzkaller spotted. This patch addresses the racy by splitting the setup of pool->closing flag out of snd_seq_pool_done(), and calling it properly before snd_seq_pool_done(). BugLink: http://lkml.kernel.org/r/CACT4Y+aqqy8bZA1fFieifNxR2fAfFQQABcBHj801+u5ePV0URw@mail.gmail.com Reported-and-tested-by: Dmitry Vyukov <dvyukov@google.com> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/seq/seq_fifo.c')
-rw-r--r--sound/core/seq/seq_fifo.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c
index 448efd4e980e..33980d1c8037 100644
--- a/sound/core/seq/seq_fifo.c
+++ b/sound/core/seq/seq_fifo.c
@@ -72,6 +72,9 @@ void snd_seq_fifo_delete(struct snd_seq_fifo **fifo)
return;
*fifo = NULL;
+ if (f->pool)
+ snd_seq_pool_mark_closing(f->pool);
+
snd_seq_fifo_clear(f);
/* wake up clients if any */