mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-06 13:30:01 -05:00
impl-client: fix client property update access check
The `pipewire.*` properties may be set by clients but not changed by them. However, how the checks are done now this allows e.g. connecting clients to set `pipewire.access` themselves, which is not intended. Fix the client property update check to not allow clients to set pipewire.protocol/access, object.serial/id, pipewire.sec.* which are supposed to be set by the server.
This commit is contained in:
parent
69baef165c
commit
0dfa05117b
1 changed files with 34 additions and 11 deletions
|
|
@ -152,30 +152,53 @@ static bool has_key(const char * const keys[], const char *key)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int update_properties(struct pw_impl_client *client, const struct spa_dict *dict, bool filter)
|
static bool check_client_property_update(struct pw_impl_client *client,
|
||||||
|
const char *key, const char *old, const char *new)
|
||||||
{
|
{
|
||||||
static const char * const ignored[] = {
|
static const char * const ignored[] = {
|
||||||
|
PW_KEY_PROTOCOL,
|
||||||
PW_KEY_OBJECT_ID,
|
PW_KEY_OBJECT_ID,
|
||||||
|
PW_KEY_OBJECT_SERIAL,
|
||||||
|
PW_KEY_ACCESS,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Refuse specific restricted keys */
|
||||||
|
if (has_key(ignored, key))
|
||||||
|
goto deny;
|
||||||
|
|
||||||
|
/* Refuse all security keys */
|
||||||
|
if (spa_strstartswith(key, "pipewire.sec."))
|
||||||
|
goto deny;
|
||||||
|
|
||||||
|
/* Restrict other pipewire.* keys */
|
||||||
|
if (spa_strstartswith(key, "pipewire.")) {
|
||||||
|
/* Refuse changing existing values */
|
||||||
|
if (old != NULL)
|
||||||
|
goto deny;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
|
||||||
|
deny:
|
||||||
|
if (!spa_streq(old, new))
|
||||||
|
pw_log_warn("%p: refuse property update '%s' from '%s' to '%s'",
|
||||||
|
client, key, old ? old : "<unset>", new ? new : "<unset>");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int update_properties(struct pw_impl_client *client, const struct spa_dict *dict, bool filter)
|
||||||
|
{
|
||||||
struct pw_resource *resource;
|
struct pw_resource *resource;
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
const char *old;
|
|
||||||
|
|
||||||
for (i = 0; i < dict->n_items; i++) {
|
for (i = 0; i < dict->n_items; i++) {
|
||||||
if (filter) {
|
if (filter) {
|
||||||
if (spa_strstartswith(dict->items[i].key, "pipewire.") &&
|
const char *old = pw_properties_get(client->properties, dict->items[i].key);
|
||||||
(old = pw_properties_get(client->properties, dict->items[i].key)) != NULL &&
|
const char *new = dict->items[i].value;
|
||||||
(dict->items[i].value == NULL || !spa_streq(old, dict->items[i].value))) {
|
|
||||||
pw_log_warn("%p: refuse property update '%s' from '%s' to '%s'",
|
|
||||||
client, dict->items[i].key, old,
|
|
||||||
dict->items[i].value);
|
|
||||||
continue;
|
|
||||||
|
|
||||||
}
|
if (!check_client_property_update(client, dict->items[i].key, old, new))
|
||||||
if (has_key(ignored, dict->items[i].key))
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
changed += pw_properties_set(client->properties, dict->items[i].key, dict->items[i].value);
|
changed += pw_properties_set(client->properties, dict->items[i].key, dict->items[i].value);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue