From 30a03883722aca1ad250550755cbecb0d5f95b5e Mon Sep 17 00:00:00 2001 From: Johan Hedberg Date: Fri, 16 Nov 2007 15:43:29 +0000 Subject: Fix D-Bus match leak for name listeners --- common/dbus.c | 78 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/common/dbus.c b/common/dbus.c index 61307bc0..f92ce45f 100644 --- a/common/dbus.c +++ b/common/dbus.c @@ -204,6 +204,52 @@ static void name_data_remove(DBusConnection *connection, } } +static gboolean add_match(DBusConnection *connection, const char *name) +{ + DBusError err; + char match_string[128]; + + snprintf(match_string, sizeof(match_string), + "interface=%s,member=NameOwnerChanged,arg0=%s", + DBUS_INTERFACE_DBUS, name); + + dbus_error_init(&err); + + dbus_bus_add_match(connection, match_string, &err); + + if (dbus_error_is_set(&err)) { + error("Adding match rule \"%s\" failed: %s", match_string, + err.message); + dbus_error_free(&err); + return FALSE; + } + + return TRUE; +} + +static gboolean remove_match(DBusConnection *connection, const char *name) +{ + DBusError err; + char match_string[128]; + + snprintf(match_string, sizeof(match_string), + "interface=%s,member=NameOwnerChanged,arg0=%s", + DBUS_INTERFACE_DBUS, name); + + dbus_error_init(&err); + + dbus_bus_remove_match(connection, match_string, &err); + + if (dbus_error_is_set(&err)) { + error("Removing owner match rule for %s failed: %s", + name, err.message); + dbus_error_free(&err); + return FALSE; + } + + return TRUE; +} + static DBusHandlerResult name_exit_filter(DBusConnection *connection, DBusMessage *message, void *user_data) { @@ -242,14 +288,14 @@ static DBusHandlerResult name_exit_filter(DBusConnection *connection, name_listeners = g_slist_remove(name_listeners, data); name_data_free(data); + remove_match(connection, name); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } int name_listener_add(DBusConnection *connection, const char *name, name_cb_t func, void *user_data) { - DBusError err; - char match_string[128]; int first; if (!name_listener_initialized) { @@ -270,17 +316,7 @@ int name_listener_add(DBusConnection *connection, const char *name, if (name) { debug("name_listener_add(%s)", name); - snprintf(match_string, sizeof(match_string), - "interface=%s,member=NameOwnerChanged,arg0=%s", - DBUS_INTERFACE_DBUS, name); - - dbus_error_init(&err); - dbus_bus_add_match(connection, match_string, &err); - - if (dbus_error_is_set(&err)) { - error("Adding match rule \"%s\" failed: %s", - match_string, err.message); - dbus_error_free(&err); + if (!add_match(connection, name)) { name_data_remove(connection, name, func, user_data); return -1; } @@ -294,8 +330,6 @@ int name_listener_remove(DBusConnection *connection, const char *name, { struct name_data *data; struct name_callback *cb; - DBusError err; - char match_string[128]; data = name_data_find(connection, name); if (!data) { @@ -319,20 +353,8 @@ int name_listener_remove(DBusConnection *connection, const char *name, if (name) { debug("name_listener_remove(%s)", name); - snprintf(match_string, sizeof(match_string), - "interface=%s,member=NameOwnerChanged,arg0=%s", - DBUS_INTERFACE_DBUS, name); - - dbus_error_init(&err); - - dbus_bus_remove_match(connection, match_string, &err); - - if (dbus_error_is_set(&err)) { - error("Removing owner match rule for %s failed: %s", - name, err.message); - dbus_error_free(&err); + if (!remove_match(connection, name)) return -1; - } } name_data_remove(connection, name, func, user_data); -- cgit