]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: seq: oss: Reject reads that cannot fit the next event
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Tue, 2 Jun 2026 11:18:39 +0000 (08:18 -0300)
committerTakashi Iwai <tiwai@suse.de>
Tue, 2 Jun 2026 17:49:29 +0000 (19:49 +0200)
snd_seq_oss_read() checks whether the next queued OSS sequencer event
fits in the remaining userspace buffer before removing it from the read
queue.

The check is inverted. It currently stops when the event is smaller than
the remaining buffer, so a normal 4-byte event is not copied for an
8-byte read buffer. Conversely, an 8-byte event can be copied for a
smaller read count.

Break only when the remaining userspace buffer is smaller than the next
event, and report -EINVAL if no complete event has been copied. This
prevents an undersized read from looking like end-of-file while leaving
the event queued for a later read with a large enough buffer.

Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260602-alsa-seq-oss-read-size-check-v1-1-10e59b1742e0@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/oss/seq_oss_rw.c

index 111c792bc72ca3829bc6ba05766c113525a1eb6a..b7147ac78ee8b2e2400908cbfc8447d9c62ded8f 100644 (file)
@@ -57,7 +57,8 @@ snd_seq_oss_read(struct seq_oss_devinfo *dp, char __user *buf, int count)
                        break;
                }
                ev_len = ev_length(&rec);
-               if (ev_len < count) {
+               if (count < ev_len) {
+                       err = -EINVAL;
                        snd_seq_oss_readq_unlock(readq, flags);
                        break;
                }