From 31f7bb4dce579a1e67e9bfd1c6041a7f8e8614619dcc8bdd0384d4a35dedd9a1 Mon Sep 17 00:00:00 2001 From: Antonio Larrosa Date: Tue, 31 Oct 2023 09:23:11 +0000 Subject: [PATCH] Accepting request 1121397 from home:alarrosa:branches:multimedia:libs - Add patch from upstream that fixes too many matches for property interest: * 0001-object-manager-reduce-the-amount-of-globals-that-initially.patch - Add patch from upstream that fixes an odd failure of a test after applying the previous patch: * 0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch - Add patch from upstream that adds ability to hide parent nodes, which is useful to prevent hardware misuse or damage by poorly behaves/configured clients: * 0001-policy-dsp-add-ability-to-hide-parent-nodes.patch OBS-URL: https://build.opensuse.org/request/show/1121397 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/wireplumber?expand=0&rev=61 --- ...the-amount-of-globals-that-initially.patch | 36 ++++++++ ...dsp-add-ability-to-hide-parent-nodes.patch | 69 +++++++++++++++ ...-idle-callback-to-expose-tmp-globals.patch | 88 +++++++++++++++++++ wireplumber.changes | 14 +++ wireplumber.spec | 6 ++ 5 files changed, 213 insertions(+) create mode 100644 0001-object-manager-reduce-the-amount-of-globals-that-initially.patch create mode 100644 0001-policy-dsp-add-ability-to-hide-parent-nodes.patch create mode 100644 0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch diff --git a/0001-object-manager-reduce-the-amount-of-globals-that-initially.patch b/0001-object-manager-reduce-the-amount-of-globals-that-initially.patch new file mode 100644 index 0000000..686639c --- /dev/null +++ b/0001-object-manager-reduce-the-amount-of-globals-that-initially.patch @@ -0,0 +1,36 @@ +From 5fc7e68d109b646c550e3fdeddebadc5047137a2 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Mon, 23 Oct 2023 23:04:02 +0300 +Subject: [PATCH] object-manager: reduce the amount of globals that initially + match the interest + +With the previous check, any global matching either the type or the global +properties of the interest would be considered for inclusion in the object +manager and would be prepared only to fail the same check later. + +The correct way to check is (variable & (X|Y) == (X|Y)), which is what +SPA_FLAG_IS_SET() expands to. + +Fixes #517 +--- + lib/wp/object-manager.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/wp/object-manager.c b/lib/wp/object-manager.c +index 6f58653ba..dea7857e1 100644 +--- a/lib/wp/object-manager.c ++++ b/lib/wp/object-manager.c +@@ -638,8 +638,8 @@ wp_object_manager_is_interested_in_global (WpObjectManager * self, + /* and consider the manager interested if the type and the globals match... + if pw_properties / g_properties fail, that's ok because they are not + known yet (the proxy is likely NULL and properties not yet retrieved) */ +- if (match & (WP_INTEREST_MATCH_GTYPE | +- WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES)) { ++ if (SPA_FLAG_IS_SET (match, (WP_INTEREST_MATCH_GTYPE | ++ WP_INTEREST_MATCH_PW_GLOBAL_PROPERTIES))) { + gpointer ft = g_hash_table_lookup (self->features, + GSIZE_TO_POINTER (global->type)); + *wanted_features = (WpObjectFeatures) GPOINTER_TO_UINT (ft); +-- +GitLab + diff --git a/0001-policy-dsp-add-ability-to-hide-parent-nodes.patch b/0001-policy-dsp-add-ability-to-hide-parent-nodes.patch new file mode 100644 index 0000000..aff077d --- /dev/null +++ b/0001-policy-dsp-add-ability-to-hide-parent-nodes.patch @@ -0,0 +1,69 @@ +From 7a65d76a57a5a656a5d9385b0144d15b376ddc7d Mon Sep 17 00:00:00 2001 +From: James Calligeros +Date: Sun, 29 Oct 2023 11:03:36 +1000 +Subject: [PATCH] policy-dsp: add ability to hide parent nodes + +some hardware devices are never supposed to be accessed directly by +clients, and are designed under the assumption that they will be +front-loaded by some sort of DSP. add a hide_parent property +to policy-dsp and revoke all permissions to the bound node of a DSP +graph where this is set to prevent hardware misuse or damage by poorly +behaved/configured clients. + +Signed-off-by: James Calligeros +--- + src/scripts/policy-dsp.lua | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/src/scripts/policy-dsp.lua b/src/scripts/policy-dsp.lua +index 55f86c68..ce23a67a 100644 +--- a/src/scripts/policy-dsp.lua ++++ b/src/scripts/policy-dsp.lua +@@ -28,7 +28,12 @@ nodes_om = ObjectManager { + Interest { type = "node" }, + } + ++clients_om = ObjectManager { ++ Interest { type = "client" } ++} ++ + filter_chains = {} ++hidden_nodes = {} + + nodes_om:connect("object-added", function (om, node) + for _, r in ipairs(config.rules or {}) do +@@ -43,6 +48,17 @@ nodes_om:connect("object-added", function (om, node) + filter_chains[id] = LocalModule("libpipewire-module-filter-chain", r.filter_chain, {}, true) + end + end ++ ++ if r.hide_parent then ++ Log.debug("Hiding node " .. node["bound-id"] .. " from clients") ++ for client in clients_om:iterate { type = "client" } do ++ if not client["properties"]["wireplumber.daemon"] then ++ client:update_permissions { [node["bound-id"]] = "-" } ++ end ++ end ++ hidden_nodes[node["bound-id"]] = id ++ end ++ + end + end + end +@@ -58,4 +74,13 @@ nodes_om:connect("object-removed", function (om, node) + end + end) + ++clients_om:connect("object-added", function (om, client) ++ for id, _ in pairs(hidden_nodes) do ++ if not client["properties"]["wireplumber.daemon"] then ++ client:update_permissions { [id] = "-" } ++ end ++ end ++end) ++ + nodes_om:activate() ++clients_om:activate() +-- +GitLab + diff --git a/0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch b/0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch new file mode 100644 index 0000000..0a54cbb --- /dev/null +++ b/0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch @@ -0,0 +1,88 @@ +From 23ba01970f2520fb30fddc4ee911d77cdda9ac22 Mon Sep 17 00:00:00 2001 +From: George Kiagiadakis +Date: Mon, 23 Oct 2023 23:08:45 +0300 +Subject: [PATCH] object-manager: use an idle callback to expose tmp globals + instead of pw_core_sync + +A core sync is not really necessary here because whatever objects the remote +pipewire daemon has to announce have already been sent to us on a message +and this message is already being processed at this point. This means, we are +not going to be returning to the main loop until all the new objects have been +announced and therefore placed into the tmp globals array. So, we can also use +an idle callback and achieve the same effect of slightly delaying until all +new globals have been announced. + +With an idle callback, we can be more agile and add those new objects immediately +after the message has been processed instead of waiting for a pw_core_sync() +reply, which will come in the next message. + +This fixes an odd failure of the si-standard-link test after applying the fix +for #517, which was caused by the fact that the test was previously relying on +a delay caused by some unrelated globals being prepared in the object manager +that tries to verify the graph state. After those globals were removed from the +internal preparation queue, the test would fail to detect the link objects +because they were stuck in the tmp_globals array for too long. +--- + lib/wp/object-manager.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/lib/wp/object-manager.c b/lib/wp/object-manager.c +index dea7857e..816db6dc 100644 +--- a/lib/wp/object-manager.c ++++ b/lib/wp/object-manager.c +@@ -1047,18 +1047,15 @@ wp_registry_detach (WpRegistry *self) + } + } + +-static void +-expose_tmp_globals (WpCore *core, GAsyncResult *res, WpRegistry *self) ++static gboolean ++expose_tmp_globals (WpCore *core) + { +- g_autoptr (GError) error = NULL; ++ WpRegistry *self = wp_core_get_registry (core); + g_autoptr (GPtrArray) tmp_globals = NULL; + +- if (!wp_core_sync_finish (core, res, &error)) +- wp_warning_object (core, "core sync error: %s", error->message); +- + /* in case the registry was cleared in the meantime... */ + if (G_UNLIKELY (!self->tmp_globals)) +- return; ++ return G_SOURCE_REMOVE; + + /* steal the tmp_globals list and replace it with an empty one */ + tmp_globals = self->tmp_globals; +@@ -1082,8 +1079,8 @@ expose_tmp_globals (WpCore *core, GAsyncResult *res, WpRegistry *self) + wp_global_rm_flag (old_g, WP_GLOBAL_FLAG_OWNED_BY_PROXY); + } + +- g_return_if_fail (self->globals->len <= g->id || +- g_ptr_array_index (self->globals, g->id) == NULL); ++ g_return_val_if_fail (self->globals->len <= g->id || ++ g_ptr_array_index (self->globals, g->id) == NULL, G_SOURCE_REMOVE); + + /* set the registry, so that wp_global_rm_flag() can work full-scale */ + g->registry = self; +@@ -1109,6 +1106,8 @@ expose_tmp_globals (WpCore *core, GAsyncResult *res, WpRegistry *self) + } + wp_object_manager_maybe_objects_changed (om); + } ++ ++ return G_SOURCE_REMOVE; + } + + /* +@@ -1159,7 +1158,8 @@ wp_registry_prepare_new_global (WpRegistry * self, guint32 id, + + /* schedule exposing when adding the first global */ + if (self->tmp_globals->len == 1) { +- wp_core_sync (core, NULL, (GAsyncReadyCallback) expose_tmp_globals, self); ++ wp_core_idle_add_closure (core, NULL, ++ g_cclosure_new_object (G_CALLBACK (expose_tmp_globals), G_OBJECT (core))); + } + } else { + /* store the most permissive permissions */ +-- +GitLab + diff --git a/wireplumber.changes b/wireplumber.changes index 6e6aa3c..423f4f8 100644 --- a/wireplumber.changes +++ b/wireplumber.changes @@ -1,3 +1,17 @@ +------------------------------------------------------------------- +Tue Oct 31 08:30:21 UTC 2023 - Antonio Larrosa + +- Add patch from upstream that fixes too many matches for property + interest: + * 0001-object-manager-reduce-the-amount-of-globals-that-initially.patch +- Add patch from upstream that fixes an odd failure of a test after + applying the previous patch: + * 0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch +- Add patch from upstream that adds ability to hide parent nodes, + which is useful to prevent hardware misuse or damage by poorly + behaves/configured clients: + * 0001-policy-dsp-add-ability-to-hide-parent-nodes.patch + ------------------------------------------------------------------- Fri Oct 13 07:17:56 UTC 2023 - Antonio Larrosa diff --git a/wireplumber.spec b/wireplumber.spec index 4d3f00e..408439f 100644 --- a/wireplumber.spec +++ b/wireplumber.spec @@ -30,6 +30,12 @@ Group: Development/Libraries/C and C++ URL: https://gitlab.freedesktop.org/pipewire/wireplumber Source0: wireplumber-%{version}.tar.xz Source1: split-config-file.py +# PATCH-FIX-UPSTREAM +Patch0: 0001-object-manager-reduce-the-amount-of-globals-that-initially.patch +# PATCH-FIX-UPSTREAM +Patch1: 0002-object-manager-use-an-idle-callback-to-expose-tmp-globals.patch +# PATCH-FIX-UPSTREAM +Patch2: 0001-policy-dsp-add-ability-to-hide-parent-nodes.patch # docs BuildRequires: doxygen BuildRequires: graphviz