link: check permissions

When creating a link between two nodes, check if the owner of a
node (when it is a client) can see the other node.
This commit is contained in:
Wim Taymans 2019-05-13 12:51:20 +02:00
parent 07ff967285
commit 23d0b9e5e2

View file

@ -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;