]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: seq: Fix UMP group 16 filtering
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Wed, 6 May 2026 03:15:48 +0000 (00:15 -0300)
committerTakashi Iwai <tiwai@suse.de>
Wed, 6 May 2026 07:56:54 +0000 (09:56 +0200)
The sequencer UAPI defines group_filter as an unsigned int bitmap.
Bit 0 filters groupless messages and bits 1-16 filter UMP groups 1-16.

The internal snd_seq_client storage is only unsigned short, so bit 16
is truncated when userspace sets the filter. The same truncation affects
the automatic UMP client filter used to avoid delivery to inactive
groups, so events for group 16 cannot be filtered.

Store the internal bitmap as unsigned int and keep both userspace-provided
and automatically generated values limited to the defined UAPI bits.

Fixes: d2b706077792 ("ALSA: seq: Add UMP group filter")
Cc: stable@vger.kernel.org
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260506-alsa-seq-ump-group16-filter-v1-1-b75160bf6993@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/seq_clientmgr.c
sound/core/seq/seq_clientmgr.h
sound/core/seq/seq_ump_client.c

index 75a7a2af9d8c963d05d3f5f34cc570684bb37922..5719637575a9113df0aca09544654c301a79115f 100644 (file)
@@ -1253,7 +1253,7 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client,
        if (client->user_pversion >= SNDRV_PROTOCOL_VERSION(1, 0, 3))
                client->midi_version = client_info->midi_version;
        memcpy(client->event_filter, client_info->event_filter, 32);
-       client->group_filter = client_info->group_filter;
+       client->group_filter = client_info->group_filter & SND_SEQ_GROUP_FILTER_MASK;
 
        /* notify the change */
        snd_seq_system_client_ev_client_change(client->number);
index ece02c58db702debcf73a05c70031914e8a46e9b..feea8bb7d9870a6dbf033f41b0bd77972cc3c8a5 100644 (file)
@@ -14,6 +14,9 @@
 
 /* client manager */
 
+#define SND_SEQ_GROUP_FILTER_MASK      GENMASK(SNDRV_UMP_MAX_GROUPS, 0)
+#define SND_SEQ_GROUP_FILTER_GROUPS    GENMASK(SNDRV_UMP_MAX_GROUPS, 1)
+
 struct snd_seq_user_client {
        struct file *file;      /* file struct of client */
        /* ... */
@@ -40,7 +43,7 @@ struct snd_seq_client {
        int number;             /* client number */
        unsigned int filter;    /* filter flags */
        DECLARE_BITMAP(event_filter, 256);
-       unsigned short group_filter;
+       unsigned int group_filter;
        snd_use_lock_t use_lock;
        int event_lost;
        /* ports */
index fdc76f23e03f48b969ea3f5f4fd351af3f02a21f..9079ccfdc8666dddb8e8b1aa3359bbfae4578b26 100644 (file)
@@ -369,7 +369,7 @@ static void setup_client_group_filter(struct seq_ump_client *client)
        cptr = snd_seq_kernel_client_get(client->seq_client);
        if (!cptr)
                return;
-       filter = ~(1U << 0); /* always allow groupless messages */
+       filter = SND_SEQ_GROUP_FILTER_GROUPS; /* always allow groupless messages */
        for (p = 0; p < SNDRV_UMP_MAX_GROUPS; p++) {
                if (client->ump->groups[p].active)
                        filter &= ~(1U << (p + 1));