mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
ALSA: seq: Fix UMP group 16 filtering
[ Upstream commit92429ca999] 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:d2b7060777("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> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
dbacde3d47
commit
7e78a5bcbd
@@ -1333,7 +1333,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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -370,7 +370,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));
|
||||
|
||||
Reference in New Issue
Block a user