From 50aacea749028a03e5fbba1b6e403987041d4e18 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 7 Apr 2026 09:44:22 +0200 Subject: [PATCH] plugins: allow some absolute paths Allow abosulte paths as long as they start with one of the search paths. --- spa/plugins/filter-graph/plugin_ladspa.c | 8 ++++++-- src/modules/module-jack-tunnel/weakjack.h | 18 +++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/spa/plugins/filter-graph/plugin_ladspa.c b/spa/plugins/filter-graph/plugin_ladspa.c index 6a43eab24..51167827b 100644 --- a/spa/plugins/filter-graph/plugin_ladspa.c +++ b/spa/plugins/filter-graph/plugin_ladspa.c @@ -265,7 +265,11 @@ static int load_ladspa_plugin(struct plugin *impl, const char *path, const char if (len >= sizeof(filename)) continue; - namelen = snprintf(filename, sizeof(filename), "%.*s/%s.so", (int) len, p, path); + if (strncmp(path, p, len) == 0) + namelen = snprintf(filename, sizeof(filename), "%s", path); + else + namelen = snprintf(filename, sizeof(filename), "%.*s/%s.so", (int) len, p, path); + if (namelen < 0 || (size_t) namelen >= sizeof(filename)) continue; @@ -340,7 +344,7 @@ impl_init(const struct spa_handle_factory *factory, make_search_paths(&path, &search_dirs); if ((res = load_ladspa_plugin(impl, path, search_dirs)) < 0) { - spa_log_error(impl->log, "failed to load plugin '%s.so' in '%s': %s", + spa_log_error(impl->log, "failed to load plugin '%s' in '%s': %s", path, search_dirs, spa_strerror(res)); return res; } diff --git a/src/modules/module-jack-tunnel/weakjack.h b/src/modules/module-jack-tunnel/weakjack.h index c35bf44b8..f5c6361ad 100644 --- a/src/modules/module-jack-tunnel/weakjack.h +++ b/src/modules/module-jack-tunnel/weakjack.h @@ -170,18 +170,22 @@ static inline int weakjack_load(struct weakjack *jack, const char *lib) search_dirs = PREFIX "/lib64/:" PREFIX "/lib/:" "/usr/lib64/:/usr/lib/:" LIBDIR; + res = -ENAMETOOLONG; + while ((p = pw_split_walk(search_dirs, ":", &len, &state))) { int pathlen; - if (len >= sizeof(path)) { - res = -ENAMETOOLONG; + if (len >= sizeof(path)) continue; - } - pathlen = snprintf(path, sizeof(path), "%.*s/%s", (int) len, p, lib); - if (pathlen < 0 || (size_t) pathlen >= sizeof(path)) { - res = -ENAMETOOLONG; + + if (strncmp(lib, p, len) == 0) + pathlen = snprintf(path, sizeof(path), "%s", lib); + else + pathlen = snprintf(path, sizeof(path), "%.*s/%s", (int) len, p, lib); + + if (pathlen < 0 || (size_t) pathlen >= sizeof(path)) continue; - } + if ((res = weakjack_load_by_path(jack, path)) == 0) break; }