]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ALSA: seq: Fix partial userptr event expansion
authorHyeongJun An <sammiee5311@gmail.com>
Sat, 6 Jun 2026 04:09:13 +0000 (13:09 +0900)
committerTakashi Iwai <tiwai@suse.de>
Sat, 6 Jun 2026 16:12:31 +0000 (18:12 +0200)
snd_seq_expand_var_event_at() clamps the number of bytes to copy to the
remaining variable-event length, but passes the original buffer size to
expand_var_event().

For SNDRV_SEQ_EXT_USRPTR events, expand_var_event() copies exactly the
size argument from userspace.  On the final chunk, when the remaining
event data is shorter than the caller's buffer, this can read past the
declared event data and can spuriously fail with -EFAULT if the extra
bytes cross an unmapped page.

Pass the clamped length instead.  The chained and kernel-backed paths
already reclamp in dump_var_event(), but the user-pointer path handles
the size directly.

Fixes: ea46f79709b6 ("ALSA: seq: Add snd_seq_expand_var_event_at() helper")
Signed-off-by: HyeongJun An <sammiee5311@gmail.com>
Link: https://patch.msgid.link/20260606040913.230213-1-sammiee5311@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/seq_memory.c

index aaf808316c30d4474ff393776041ec3fcac96deb..ca9f6db0022c82a3175dfa7ca0eb76415d4cbc54 100644 (file)
@@ -211,7 +211,7 @@ int snd_seq_expand_var_event_at(const struct snd_seq_event *event, int count,
        len -= offset;
        if (len > count)
                len = count;
-       err = expand_var_event(event, offset, count, buf, true);
+       err = expand_var_event(event, offset, len, buf, true);
        if (err < 0)
                return err;
        return len;