From ac97175380622b5c0f540c3ff528410764775240 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 16 Jul 2020 13:25:03 +0200 Subject: [PATCH] pulse: don't try to do set_param when not writable --- pipewire-pulseaudio/src/context.c | 1 + pipewire-pulseaudio/src/internal.h | 1 + pipewire-pulseaudio/src/introspect.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index 35ce15e18..13585d56a 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1214,6 +1214,7 @@ static void registry_event_global(void *data, uint32_t id, pw_log_debug("context %p: global %d %s %p", c, id, type, g); g->context = c; g->id = id; + g->permissions = permissions; g->type = strdup(type); g->init = true; g->props = props ? pw_properties_new_dict(props) : NULL; diff --git a/pipewire-pulseaudio/src/internal.h b/pipewire-pulseaudio/src/internal.h index 68281bbf4..9d796e6fa 100644 --- a/pipewire-pulseaudio/src/internal.h +++ b/pipewire-pulseaudio/src/internal.h @@ -243,6 +243,7 @@ struct global_info { struct global { struct spa_list link; uint32_t id; + uint32_t permissions; char *type; struct pw_properties *props; diff --git a/pipewire-pulseaudio/src/introspect.c b/pipewire-pulseaudio/src/introspect.c index 303eeda64..fbe3bf4c9 100644 --- a/pipewire-pulseaudio/src/introspect.c +++ b/pipewire-pulseaudio/src/introspect.c @@ -372,6 +372,9 @@ static int set_node_volume(pa_context *c, struct global *g, const pa_cvolume *vo } g->node_info.mute = mute; + if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_W | PW_PERM_X)) + return PA_ERR_ACCESS; + pw_node_set_param((struct pw_node*)g->proxy, SPA_PARAM_Props, 0, spa_pod_builder_add_object(&b, @@ -416,6 +419,9 @@ static int set_device_volume(pa_context *c, struct global *g, struct global *cg, } g->node_info.mute = mute; + if (!SPA_FLAG_IS_SET(cg->permissions, PW_PERM_W | PW_PERM_X)) + return PA_ERR_ACCESS; + spa_pod_builder_push_object(&b, &f[0], SPA_TYPE_OBJECT_ParamRoute, SPA_PARAM_Route); spa_pod_builder_add(&b, @@ -696,6 +702,9 @@ static int set_device_route(pa_context *c, struct global *g, const char *port, e if (id == SPA_ID_INVALID) return PA_ERR_NOENTITY; + if (!SPA_FLAG_IS_SET(cg->permissions, PW_PERM_W | PW_PERM_X)) + return PA_ERR_ACCESS; + pw_device_set_param((struct pw_device*)cg->proxy, SPA_PARAM_Route, 0, spa_pod_builder_add_object(&b, @@ -1753,6 +1762,11 @@ static void card_profile(pa_operation *o, void *userdata) if (id == SPA_ID_INVALID) goto done;; + if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_W | PW_PERM_X)) { + pa_context_set_error(c, PA_ERR_ACCESS); + goto done; + } + pw_device_set_param((struct pw_device*)g->proxy, SPA_PARAM_Profile, 0, spa_pod_builder_add_object(&b,