diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2010-10-08 23:36:44 +0200 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2010-10-08 23:36:44 +0200 |
commit | d8ca643864d54183330618f0418ba0388e4b9dde (patch) | |
tree | 1c5ad7c477829abecbc93c49737b9c79bd7223ba | |
parent | e902fab6a63e2df6c0ad4953a7b10522f85e2205 (diff) | |
download | connman-d8ca643864d54183330618f0418ba0388e4b9dde.tar.gz connman-d8ca643864d54183330618f0418ba0388e4b9dde.tar.bz2 connman-d8ca643864d54183330618f0418ba0388e4b9dde.zip |
Release counter and session watches whe unregistering
Releasing the watches from the hash table freeing routines lead to double
freeing the interface data watch pointer in case the owner would disappear
before unregistering.
-rw-r--r-- | src/counter.c | 9 | ||||
-rw-r--r-- | src/session.c | 6 |
2 files changed, 9 insertions, 6 deletions
diff --git a/src/counter.c b/src/counter.c index 6a0a994c..4fc47488 100644 --- a/src/counter.c +++ b/src/counter.c @@ -45,9 +45,6 @@ static void remove_counter(gpointer user_data) DBG("owner %s path %s", counter->owner, counter->path); - if (counter->watch > 0) - g_dbus_remove_watch(connection, counter->watch); - __connman_rtnl_update_interval_remove(counter->interval); __connman_service_counter_unregister(counter->path); @@ -119,6 +116,9 @@ int __connman_counter_unregister(const char *owner, const char *path) if (g_strcmp0(owner, counter->owner) != 0) return -EACCES; + if (counter->watch > 0) + g_dbus_remove_watch(connection, counter->watch); + g_hash_table_remove(owner_mapping, counter->owner); g_hash_table_remove(counter_table, counter->path); @@ -150,6 +150,9 @@ static void release_counter(gpointer key, gpointer value, gpointer user_data) DBG("owner %s path %s", counter->owner, counter->path); + if (counter->watch > 0) + g_dbus_remove_watch(connection, counter->watch); + message = dbus_message_new_method_call(counter->owner, counter->path, CONNMAN_COUNTER_INTERFACE, "Release"); if (message == NULL) diff --git a/src/session.c b/src/session.c index 3d3c92db..9264c0cc 100644 --- a/src/session.c +++ b/src/session.c @@ -104,9 +104,6 @@ static void remove_session(gpointer user_data) { struct connman_session *session = user_data; - if (session->watch > 0) - g_dbus_remove_watch(connection, session->watch); - session->bearer = NULL; if (session->service) connman_service_unref(session->service); @@ -152,6 +149,9 @@ static int session_disconnect(struct connman_session *session) g_hash_table_remove(bearer_hash, bearer); } + if (session->watch > 0) + g_dbus_remove_watch(connection, session->watch); + g_hash_table_remove(session_hash, session); return 0; |