diff options
author | Daniel Orstadius <daniel.orstadius@gmail.com> | 2009-12-16 11:23:46 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-16 22:34:49 -0800 |
commit | 852e6e494d09b399e77803441582525ae6a38f74 (patch) | |
tree | 94affe6dcfc2e6fe3114a5f8dc01372466479e16 /gdbus | |
parent | dc9ba2262b1ce917da82d1678f0fc3f1d744547d (diff) | |
download | connman-852e6e494d09b399e77803441582525ae6a38f74.tar.gz connman-852e6e494d09b399e77803441582525ae6a38f74.tar.bz2 connman-852e6e494d09b399e77803441582525ae6a38f74.zip |
Fix D-Bus timeout handling
Timeouts should also be removed in the remove_timeout callback in
addition to the timeout_handler_free function. This is how dbus-glib
does it and it seems to prevent crashes in certain situations.
Diffstat (limited to 'gdbus')
-rw-r--r-- | gdbus/mainloop.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/gdbus/mainloop.c b/gdbus/mainloop.c index bd775f8b..7abdf478 100644 --- a/gdbus/mainloop.c +++ b/gdbus/mainloop.c @@ -183,7 +183,11 @@ static void timeout_handler_free(void *data) if (!handler) return; - g_source_remove(handler->id); + if (handler->id > 0) { + g_source_remove(handler->id); + handler->id = 0; + } + g_free(handler); } @@ -207,6 +211,17 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) static void remove_timeout(DBusTimeout *timeout, void *data) { + timeout_handler_t *handler; + + handler = dbus_timeout_get_data(timeout); + + if (!handler) + return; + + if (handler->id > 0) { + g_source_remove(handler->id); + handler->id = 0; + } } static void timeout_toggled(DBusTimeout *timeout, void *data) |