ALSA: pcm: Abort properly at pending signal in OSS read/write loops
authorTakashi Iwai <tiwai@suse.de>
Mon, 8 Jan 2018 12:58:31 +0000 (13:58 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 8 Jan 2018 14:16:52 +0000 (15:16 +0100)
The loops for read and write in PCM OSS emulation have no proper check
of pending signals, and they keep processing even after user tries to
break.  This results in a very long delay, often seen as RCU stall
when a huge unprocessed bytes remain queued.  The bug could be easily
triggered by syzkaller.

As a simple workaround, this patch adds the proper check of pending
signals and aborts the loop appropriately.

Reported-by: syzbot+993cb4cfcbbff3947c21@syzkaller.appspotmail.com
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/oss/pcm_oss.c

index ceaa51f..e317964 100644 (file)
@@ -1381,6 +1381,10 @@ static ssize_t snd_pcm_oss_write1(struct snd_pcm_substream *substream, const cha
                            tmp != runtime->oss.period_bytes)
                                break;
                }
+               if (signal_pending(current)) {
+                       tmp = -ERESTARTSYS;
+                       goto err;
+               }
        }
        mutex_unlock(&runtime->oss.params_lock);
        return xfer;
@@ -1466,6 +1470,10 @@ static ssize_t snd_pcm_oss_read1(struct snd_pcm_substream *substream, char __use
                        bytes -= tmp;
                        xfer += tmp;
                }
+               if (signal_pending(current)) {
+                       tmp = -ERESTARTSYS;
+                       goto err;
+               }
        }
        mutex_unlock(&runtime->oss.params_lock);
        return xfer;