Commit 2b5ff4db5d7a for kernel

commit 2b5ff4db5d7aa5b981d966df02e687f79ad7b311
Author: Kyle Zeng <kylebot@openai.com>
Date:   Fri Jun 5 01:02:04 2026 -0700

    ALSA: seq: dummy: fix UMP event stack overread

    The dummy sequencer port forwards events by copying an incoming
    struct snd_seq_event into a stack temporary, rewriting source and
    destination, and dispatching the temporary to subscribers. That legacy
    event storage is smaller than struct snd_seq_ump_event.

    When a UMP event reaches the dummy client, the copy leaves the UMP flag
    set but only provides legacy-sized stack storage. The subscriber
    delivery path then uses snd_seq_event_packet_size() and copies a
    UMP-sized packet from that stack object, reading past the end of the
    temporary.

    Use the existing union __snd_seq_event storage and copy the packet size
    reported for the incoming event before rewriting the common routing
    fields. This preserves the full UMP packet for UMP events while keeping
    legacy event handling unchanged.

    Fixes: 32cb23a0f911 ("ALSA: seq: dummy: Allow UMP conversion")
    Signed-off-by: Kyle Zeng <kylebot@openai.com>
    Link: https://patch.msgid.link/20260605080204.32045-1-kylebot@openai.com
    Signed-off-by: Takashi Iwai <tiwai@suse.de>

diff --git a/sound/core/seq/seq_dummy.c b/sound/core/seq/seq_dummy.c
index af45f328ae99..8abe80985dad 100644
--- a/sound/core/seq/seq_dummy.c
+++ b/sound/core/seq/seq_dummy.c
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <sound/core.h>
 #include "seq_clientmgr.h"
+#include "seq_memory.h"
 #include <sound/initval.h>
 #include <sound/asoundef.h>

@@ -81,19 +82,21 @@ dummy_input(struct snd_seq_event *ev, int direct, void *private_data,
 	    int atomic, int hop)
 {
 	struct snd_seq_dummy_port *p;
-	struct snd_seq_event tmpev;
+	union __snd_seq_event tmpev;
+	size_t size;

 	p = private_data;
 	if (ev->source.client == SNDRV_SEQ_CLIENT_SYSTEM ||
 	    ev->type == SNDRV_SEQ_EVENT_KERNEL_ERROR)
 		return 0; /* ignore system messages */
-	tmpev = *ev;
+	size = snd_seq_event_packet_size(ev);
+	memcpy(&tmpev, ev, size);
 	if (p->duplex)
-		tmpev.source.port = p->connect;
+		tmpev.legacy.source.port = p->connect;
 	else
-		tmpev.source.port = p->port;
-	tmpev.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
-	return snd_seq_kernel_client_dispatch(p->client, &tmpev, atomic, hop);
+		tmpev.legacy.source.port = p->port;
+	tmpev.legacy.dest.client = SNDRV_SEQ_ADDRESS_SUBSCRIBERS;
+	return snd_seq_kernel_client_dispatch(p->client, &tmpev.legacy, atomic, hop);
 }

 /*