From 2cd59fdf8b3076cc0771d818ada3e4b524bd7641 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 24 Nov 2020 10:18:17 +0100 Subject: [PATCH] pulse-server: don't send invalid format and channels --- .../module-protocol-pulse/pulse-server.c | 20 +++++++++++++++++++ src/modules/module-protocol-pulse/volume.c | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/src/modules/module-protocol-pulse/pulse-server.c b/src/modules/module-protocol-pulse/pulse-server.c index 33e346a30..776081c73 100644 --- a/src/modules/module-protocol-pulse/pulse-server.c +++ b/src/modules/module-protocol-pulse/pulse-server.c @@ -3410,6 +3410,11 @@ static int fill_sink_info(struct client *client, struct message *m, collect_device_info(o, card, &dev_info); + if (!sample_spec_valid(&dev_info.ss) || + !channel_map_valid(&dev_info.map) || + !volume_valid(&dev_info.volume_info.volume)) + return -ENOENT; + flags = SINK_LATENCY | SINK_DYNAMIC_LATENCY | SINK_DECIBEL_VOLUME; if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_API)) != NULL) flags |= SINK_HARDWARE; @@ -3539,6 +3544,11 @@ static int fill_source_info(struct client *client, struct message *m, collect_device_info(o, card, &dev_info); + if (!sample_spec_valid(&dev_info.ss) || + !channel_map_valid(&dev_info.map) || + !volume_valid(&dev_info.volume_info.volume)) + return -ENOENT; + flags = SOURCE_LATENCY | SOURCE_DYNAMIC_LATENCY | SOURCE_DECIBEL_VOLUME; if ((str = spa_dict_lookup(info->props, PW_KEY_DEVICE_API)) != NULL) flags |= SOURCE_HARDWARE; @@ -3642,6 +3652,11 @@ static int fill_sink_input_info(struct client *client, struct message *m, collect_device_info(o, NULL, &dev_info); + if (!sample_spec_valid(&dev_info.ss) || + !channel_map_valid(&dev_info.map) || + !volume_valid(&dev_info.volume_info.volume)) + return -ENOENT; + peer = find_linked(manager, o->id, PW_DIRECTION_OUTPUT); message_put(m, @@ -3707,6 +3722,11 @@ static int fill_source_output_info(struct client *client, struct message *m, collect_device_info(o, NULL, &dev_info); + if (!sample_spec_valid(&dev_info.ss) || + !channel_map_valid(&dev_info.map) || + !volume_valid(&dev_info.volume_info.volume)) + return -ENOENT; + peer = find_linked(manager, o->id, PW_DIRECTION_INPUT); if (peer && is_source_or_monitor(peer)) { peer_id = peer->id; diff --git a/src/modules/module-protocol-pulse/volume.c b/src/modules/module-protocol-pulse/volume.c index 261e111d5..e400f6710 100644 --- a/src/modules/module-protocol-pulse/volume.c +++ b/src/modules/module-protocol-pulse/volume.c @@ -37,6 +37,13 @@ struct volume { .values[1] = 1.0f, \ } +static inline bool volume_valid(const struct volume *vol) +{ + if (vol->channels == 0 || vol->channels > CHANNELS_MAX) + return false; + return true; +} + struct volume_info { struct volume volume; struct channel_map map;