diff --git a/src/pipewire/link.c b/src/pipewire/link.c index 20e2688bd..1e39da58f 100644 --- a/src/pipewire/link.c +++ b/src/pipewire/link.c @@ -1171,6 +1171,28 @@ static void try_unlink_controls(struct impl *impl, struct pw_port *output, struc } } +static int +check_permission(struct pw_core *core, + struct pw_port *output, + struct pw_port *input, + struct pw_properties *properties) +{ + struct pw_node *input_node, *output_node; + struct pw_client *client; + + input_node = input->node; + output_node = output->node; + + if ((client = output_node->global->owner) != NULL && + !PW_PERM_IS_R(pw_global_get_permissions(input_node->global, client))) + return -EPERM; + + if ((client = input_node->global->owner) != NULL && + !PW_PERM_IS_R(pw_global_get_permissions(output_node->global, client))) + return -EPERM; + return 0; +} + SPA_EXPORT struct pw_link *pw_link_new(struct pw_core *core, struct pw_port *output, @@ -1195,6 +1217,9 @@ struct pw_link *pw_link_new(struct pw_core *core, if (pw_link_find(output, input)) goto link_exists; + if (check_permission(core, output, input, properties) < 0) + goto link_not_allowed; + input_node = input->node; output_node = output->node; @@ -1291,6 +1316,9 @@ struct pw_link *pw_link_new(struct pw_core *core, link_exists: asprintf(error, "link already exists"); return NULL; + link_not_allowed: + asprintf(error, "link not allowed"); + return NULL; no_mem: asprintf(error, "no memory"); return NULL;