modules: fix portal error handling

Mostly to fix the property cleanup.
This commit is contained in:
Wim Taymans 2026-05-06 13:48:35 +02:00
parent 51b635cc98
commit ac95f1241e

View file

@ -123,24 +123,29 @@ static const struct pw_context_events context_events = {
.check_access = context_check_access, .check_access = context_check_access,
}; };
static void module_destroy(void *data) static void impl_destroy(struct impl *impl)
{ {
struct impl *impl = data; if (impl->context)
spa_hook_remove(&impl->context_listener);
spa_hook_remove(&impl->context_listener);
spa_hook_remove(&impl->module_listener);
cancel_and_unref(&impl->portal_pid_pending); cancel_and_unref(&impl->portal_pid_pending);
if (impl->bus) if (impl->bus)
dbus_connection_unref(impl->bus); dbus_connection_unref(impl->bus);
spa_dbus_connection_destroy(impl->conn); if (impl->conn)
spa_dbus_connection_destroy(impl->conn);
pw_properties_free(impl->properties); pw_properties_free(impl->properties);
free(impl); free(impl);
} }
static void module_destroy(void *data)
{
struct impl *impl = data;
spa_hook_remove(&impl->module_listener);
impl_destroy(impl);
}
static const struct pw_impl_module_events module_events = { static const struct pw_impl_module_events module_events = {
PW_VERSION_IMPL_MODULE_EVENTS, PW_VERSION_IMPL_MODULE_EVENTS,
.destroy = module_destroy, .destroy = module_destroy,
@ -297,24 +302,25 @@ int pipewire__module_init(struct pw_impl_module *module, const char *args)
pw_log_debug("module %p: new", impl); pw_log_debug("module %p: new", impl);
impl->context = context; impl->context = context;
pw_context_add_listener(context, &impl->context_listener, &context_events, impl);
impl->properties = args ? pw_properties_new_string(args) : NULL; impl->properties = args ? pw_properties_new_string(args) : NULL;
impl->conn = spa_dbus_get_connection(dbus, SPA_DBUS_TYPE_SESSION); impl->conn = spa_dbus_get_connection(dbus, SPA_DBUS_TYPE_SESSION);
if (impl->conn == NULL) { if (impl->conn == NULL) {
res = -errno; res = -errno;
pw_log_error("Failed to connect to session bus: %s", spa_strerror(res));
goto error; goto error;
} }
if ((res = init_dbus_connection(impl)) < 0) if ((res = init_dbus_connection(impl)) < 0)
goto error; goto error;
pw_context_add_listener(context, &impl->context_listener, &context_events, impl);
pw_impl_module_add_listener(module, &impl->module_listener, &module_events, impl); pw_impl_module_add_listener(module, &impl->module_listener, &module_events, impl);
return 0; return 0;
error: error:
free(impl); impl_destroy(impl);
pw_log_error("Failed to connect to session bus: %s", spa_strerror(res));
return res; return res;
} }