From 212f00f40fde1f7b7e45fb14f4b1de37d2b98ec0 Mon Sep 17 00:00:00 2001 From: Imran Zaman Date: Thu, 19 Sep 2013 13:55:06 +0300 Subject: [PATCH] fixed crash bug for p2p case --- src/daemon/dbus/gumd-dbus-group-service-adapter.c | 115 ++++++++++++--------- src/daemon/dbus/gumd-dbus-server-p2p.c | 26 +++-- src/daemon/dbus/gumd-dbus-user-service-adapter.c | 117 +++++++++++++--------- 3 files changed, 152 insertions(+), 106 deletions(-) diff --git a/src/daemon/dbus/gumd-dbus-group-service-adapter.c b/src/daemon/dbus/gumd-dbus-group-service-adapter.c index a58d411..2f1844d 100644 --- a/src/daemon/dbus/gumd-dbus-group-service-adapter.c +++ b/src/daemon/dbus/gumd-dbus-group-service-adapter.c @@ -150,6 +150,42 @@ _get_property ( } } +static void +_on_group_added ( + GObject *object, + guint gid, + gpointer group_data) +{ + GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( + group_data); + gum_dbus_group_service_emit_group_added (self->priv->dbus_group_service, + gid); +} + +static void +_on_group_deleted ( + GObject *object, + guint gid, + gpointer group_data) +{ + GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( + group_data); + gum_dbus_group_service_emit_group_deleted (self->priv->dbus_group_service, + gid); +} + +static void +_on_group_updated ( + GObject *object, + guint gid, + gpointer group_data) +{ + GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( + group_data); + gum_dbus_group_service_emit_group_updated (self->priv->dbus_group_service, + gid); +} + static PeerGroupService * _dbus_peer_group_new ( GumdDbusGroupServiceAdapter *self, @@ -206,6 +242,13 @@ _dispose ( self); } + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_group_added, self); + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_group_deleted, self); + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_group_updated, self); + GUM_OBJECT_UNREF (self->priv->daemon); if (self->priv->dbus_group_service) { @@ -393,40 +436,22 @@ _on_dbus_group_adapter_disposed ( } } -static void -_on_group_added ( - GObject *object, - guint gid, - gpointer group_data) -{ - GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( - group_data); - gum_dbus_group_service_emit_group_added (self->priv->dbus_group_service, - gid); -} - -static void -_on_group_deleted ( - GObject *object, - guint gid, - gpointer group_data) -{ - GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( - group_data); - gum_dbus_group_service_emit_group_deleted (self->priv->dbus_group_service, - gid); -} - -static void -_on_group_updated ( - GObject *object, - guint gid, - gpointer group_data) +static gchar * +_get_sender ( + GumdDbusGroupServiceAdapter *self, + GDBusMethodInvocation *invocation) { - GumdDbusGroupServiceAdapter *self = GUMD_DBUS_GROUP_SERVICE_ADAPTER ( - group_data); - gum_dbus_group_service_emit_group_updated (self->priv->dbus_group_service, - gid); + gchar *sender = NULL; + if (self->priv->dbus_server_type == GUMD_DBUS_SERVER_BUSTYPE_MSG_BUS) { + sender = g_strdup (g_dbus_method_invocation_get_sender (invocation)); + } else { + GDBusConnection *connection = g_dbus_method_invocation_get_connection ( + invocation); + sender = g_strdup_printf ("%d", g_socket_get_fd ( + g_socket_connection_get_socket (G_SOCKET_CONNECTION ( + g_dbus_connection_get_stream(connection))))); + } + return sender; } static GumdDbusGroupAdapter * @@ -435,7 +460,6 @@ _create_and_cache_dbus_group ( GumdDaemonGroup *group, GDBusMethodInvocation *invocation) { - const gchar *sender = NULL; GDBusConnection *connection = g_dbus_method_invocation_get_connection ( invocation); @@ -448,10 +472,9 @@ _create_and_cache_dbus_group ( if (g_list_length (self->priv->peer_groups) == 0) gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); - sender = g_dbus_method_invocation_get_sender (invocation); - self->priv->peer_groups = g_list_append (self->priv->peer_groups, - _dbus_peer_group_new (self, sender, dbus_group)); + _dbus_peer_group_new (self, _get_sender (self, invocation), + dbus_group)); g_object_weak_ref (G_OBJECT (dbus_group), _on_dbus_group_adapter_disposed, self); @@ -464,17 +487,19 @@ _create_and_cache_dbus_group ( static GumdDbusGroupAdapter * _get_dbus_group_from_cache ( GumdDbusGroupServiceAdapter *self, - const gchar *peer_name, + GDBusMethodInvocation *invocation, gid_t gid) { GumdDbusGroupAdapter *dbus_group = NULL; PeerGroupService *peer_group = NULL; GList *list = self->priv->peer_groups; + gchar *peer_name = NULL; if (gid == GUM_GROUP_INVALID_GID) { return NULL; } + peer_name = _get_sender (self, invocation); DBG ("peername:%s uid %u", peer_name, gid); for ( ; list != NULL; list = g_list_next (list)) { peer_group = (PeerGroupService *) list->data; @@ -484,6 +509,7 @@ _get_dbus_group_from_cache ( break; } } + g_free (peer_name); return dbus_group; } @@ -528,12 +554,10 @@ _handle_get_group ( GumdDaemonGroup *group = NULL; GError *error = NULL; GumdDbusGroupAdapter *dbus_group = NULL; - const gchar *peer_name = NULL; gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); - peer_name = g_dbus_method_invocation_get_sender (invocation); - dbus_group = _get_dbus_group_from_cache (self, peer_name, gid); + dbus_group = _get_dbus_group_from_cache (self, invocation, gid); if (!dbus_group) { group = gumd_daemon_get_group (self->priv->daemon, (gid_t)gid, &error); if (group) { @@ -569,15 +593,13 @@ _handle_get_group_by_name ( GError *error = NULL; GumdDbusGroupAdapter *dbus_group = NULL; gid_t gid = GUM_GROUP_INVALID_GID; - const gchar *peer_name = NULL; gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); gid = gumd_daemon_group_get_gid_by_name (groupname, gumd_daemon_get_config ( self->priv->daemon)); - peer_name = g_dbus_method_invocation_get_sender (invocation); - dbus_group = _get_dbus_group_from_cache (self, peer_name, gid); + dbus_group = _get_dbus_group_from_cache (self, invocation, gid); if (!dbus_group) { group = gumd_daemon_get_group (self->priv->daemon, (gid_t)gid, &error); if (group) { @@ -589,8 +611,7 @@ _handle_get_group_by_name ( gum_dbus_group_service_complete_get_group_by_name ( self->priv->dbus_group_service, invocation, gumd_dbus_group_adapter_get_object_path (dbus_group)); - } - else { + } else { if (!error) { error = gum_get_gerror_for_id (GUM_ERROR_GROUP_NOT_FOUND, "Group Not Found"); @@ -622,7 +643,7 @@ gumd_dbus_group_service_adapter_new_with_connection ( if (!g_dbus_interface_skeleton_export ( G_DBUS_INTERFACE_SKELETON(adapter->priv->dbus_group_service), adapter->priv->connection, GUM_GROUP_SERVICE_OBJECTPATH, &err)) { - ERR ("failed to register object: %s", err->message); + WARN ("failed to register object: %s", err->message); g_error_free (err); g_object_unref (adapter); return NULL; diff --git a/src/daemon/dbus/gumd-dbus-server-p2p.c b/src/daemon/dbus/gumd-dbus-server-p2p.c index 184c6d2..bca9afe 100644 --- a/src/daemon/dbus/gumd-dbus-server-p2p.c +++ b/src/daemon/dbus/gumd-dbus-server-p2p.c @@ -187,24 +187,28 @@ static void _add_user_watchers ( gpointer connection, gpointer user_service, - gpointer user_data) + GumdDbusServerP2P *server) { g_signal_connect (connection, "closed", G_CALLBACK(_on_connection_closed), - user_data); + server); g_object_weak_ref (G_OBJECT (user_service), _on_user_service_dispose, - user_data); + server); + g_hash_table_insert (server->priv->user_service_adapters, connection, + user_service); } static void _add_group_watchers ( gpointer connection, gpointer group_service, - gpointer user_data) + GumdDbusServerP2P *server) { g_signal_connect (connection, "closed", G_CALLBACK(_on_connection_closed), - user_data); + server); g_object_weak_ref (G_OBJECT (group_service), _on_group_service_dispose, - user_data); + server); + g_hash_table_insert (server->priv->group_service_adapters, connection, + group_service); } static void @@ -303,8 +307,8 @@ _on_connection_closed ( connection); if (service) { _clear_user_watchers (connection, service, user_data); - DBG("P2P dbus connection(%p) closed (peer vanished : %d) with error:" - " %s", connection,remote_peer_vanished, + DBG("P2P dbus connection(%p) user service closed (peer vanished : %d)" + " with error: %s", connection, remote_peer_vanished, error ? error->message : "NONE"); g_hash_table_remove (server->priv->user_service_adapters, connection); } @@ -313,10 +317,10 @@ _on_connection_closed ( connection); if (service) { _clear_group_watchers (connection, service, user_data); - DBG("P2P dbus connection(%p) closed (peer vanished : %d) with error:" - " %s", connection,remote_peer_vanished, + DBG("P2P dbus connection(%p) group_service closed (peer vanished : %d)" + " with error: %s", connection, remote_peer_vanished, error ? error->message : "NONE"); - g_hash_table_remove (server->priv->user_service_adapters, connection); + g_hash_table_remove (server->priv->group_service_adapters, connection); } } diff --git a/src/daemon/dbus/gumd-dbus-user-service-adapter.c b/src/daemon/dbus/gumd-dbus-user-service-adapter.c index 4649cb0..571b5db 100644 --- a/src/daemon/dbus/gumd-dbus-user-service-adapter.c +++ b/src/daemon/dbus/gumd-dbus-user-service-adapter.c @@ -150,14 +150,49 @@ _get_property ( } } +static void +_on_user_added ( + GObject *object, + guint uid, + gpointer user_data) +{ + GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( + user_data); + gum_dbus_user_service_emit_user_added (self->priv->dbus_user_service, uid); +} + +static void +_on_user_deleted ( + GObject *object, + guint uid, + gpointer user_data) +{ + GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( + user_data); + gum_dbus_user_service_emit_user_deleted (self->priv->dbus_user_service, + uid); +} + +static void +_on_user_updated ( + GObject *object, + guint uid, + gpointer user_data) +{ + GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( + user_data); + gum_dbus_user_service_emit_user_updated (self->priv->dbus_user_service, + uid); +} + static PeerUserService * _dbus_peer_user_new ( GumdDbusUserServiceAdapter *self, - const gchar *peer_name, + gchar *peer_name, GumdDbusUserAdapter *dbus_user) { PeerUserService *peer_user = g_malloc0 (sizeof (PeerUserService)); - peer_user->peer_name = g_strdup (peer_name); + peer_user->peer_name = peer_name; peer_user->dbus_user = dbus_user; peer_user->user_service = self; return peer_user; @@ -206,6 +241,13 @@ _dispose ( self); } + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_user_added, self); + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_user_deleted, self); + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->daemon), + _on_user_updated, self); + GUM_OBJECT_UNREF (self->priv->daemon); if (self->priv->dbus_user_service) { @@ -394,39 +436,22 @@ _on_dbus_user_adapter_disposed ( } } -static void -_on_user_added ( - GObject *object, - guint uid, - gpointer user_data) -{ - GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( - user_data); - gum_dbus_user_service_emit_user_added (self->priv->dbus_user_service, uid); -} - -static void -_on_user_deleted ( - GObject *object, - guint uid, - gpointer user_data) -{ - GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( - user_data); - gum_dbus_user_service_emit_user_deleted (self->priv->dbus_user_service, - uid); -} - -static void -_on_user_updated ( - GObject *object, - guint uid, - gpointer user_data) +static gchar * +_get_sender ( + GumdDbusUserServiceAdapter *self, + GDBusMethodInvocation *invocation) { - GumdDbusUserServiceAdapter *self = GUMD_DBUS_USER_SERVICE_ADAPTER ( - user_data); - gum_dbus_user_service_emit_user_updated (self->priv->dbus_user_service, - uid); + gchar *sender = NULL; + if (self->priv->dbus_server_type == GUMD_DBUS_SERVER_BUSTYPE_MSG_BUS) { + sender = g_strdup (g_dbus_method_invocation_get_sender (invocation)); + } else { + GDBusConnection *connection = g_dbus_method_invocation_get_connection ( + invocation); + sender = g_strdup_printf ("%d", g_socket_get_fd ( + g_socket_connection_get_socket (G_SOCKET_CONNECTION ( + g_dbus_connection_get_stream(connection))))); + } + return sender; } static GumdDbusUserAdapter * @@ -435,7 +460,6 @@ _create_and_cache_dbus_user ( GumdDaemonUser *user, GDBusMethodInvocation *invocation) { - const gchar *sender = NULL; GDBusConnection *connection = g_dbus_method_invocation_get_connection ( invocation); @@ -448,10 +472,9 @@ _create_and_cache_dbus_user ( if (g_list_length (self->priv->peer_users) == 0) gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); - sender = g_dbus_method_invocation_get_sender (invocation); - self->priv->peer_users = g_list_append (self->priv->peer_users, - _dbus_peer_user_new (self, sender, dbus_user)); + _dbus_peer_user_new (self, _get_sender (self, invocation), + dbus_user)); g_object_weak_ref (G_OBJECT (dbus_user), _on_dbus_user_adapter_disposed, self); @@ -464,17 +487,19 @@ _create_and_cache_dbus_user ( static GumdDbusUserAdapter * _get_dbus_user_from_cache ( GumdDbusUserServiceAdapter *self, - const gchar *peer_name, + GDBusMethodInvocation *invocation, uid_t uid) { GumdDbusUserAdapter *dbus_user = NULL; PeerUserService *peer_user = NULL; GList *list = self->priv->peer_users; + gchar *peer_name = NULL; if (uid == GUM_USER_INVALID_UID) { return NULL; } + peer_name = _get_sender (self, invocation); DBG ("peername:%s uid %u", peer_name, uid); for ( ; list != NULL; list = g_list_next (list)) { peer_user = (PeerUserService *) list->data; @@ -484,6 +509,7 @@ _get_dbus_user_from_cache ( break; } } + g_free (peer_name); return dbus_user; } @@ -528,12 +554,10 @@ _handle_get_user ( GumdDaemonUser *user = NULL; GError *error = NULL; GumdDbusUserAdapter *dbus_user = NULL; - const gchar *peer_name = NULL; gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); - peer_name = g_dbus_method_invocation_get_sender (invocation); - dbus_user = _get_dbus_user_from_cache (self, peer_name, uid); + dbus_user = _get_dbus_user_from_cache (self, invocation, uid); if (!dbus_user) { user = gumd_daemon_get_user (self->priv->daemon, (uid_t)uid, &error); if (user) { @@ -569,15 +593,13 @@ _handle_get_user_by_name ( GError *error = NULL; GumdDbusUserAdapter *dbus_user = NULL; uid_t uid = GUM_USER_INVALID_UID; - const gchar *peer_name = NULL; gum_disposable_set_auto_dispose (GUM_DISPOSABLE (self), FALSE); uid = gumd_daemon_user_get_uid_by_name (username, gumd_daemon_get_config ( self->priv->daemon)); - peer_name = g_dbus_method_invocation_get_sender (invocation); - dbus_user = _get_dbus_user_from_cache (self, peer_name, uid); + dbus_user = _get_dbus_user_from_cache (self, invocation, uid); if (!dbus_user) { user = gumd_daemon_get_user (self->priv->daemon, (uid_t)uid, &error); if (user) { @@ -589,8 +611,7 @@ _handle_get_user_by_name ( gum_dbus_user_service_complete_get_user_by_name ( self->priv->dbus_user_service, invocation, gumd_dbus_user_adapter_get_object_path (dbus_user)); - } - else { + } else { if (!error) { error = gum_get_gerror_for_id (GUM_ERROR_USER_NOT_FOUND, "User Not Found"); @@ -622,7 +643,7 @@ gumd_dbus_user_service_adapter_new_with_connection ( if (!g_dbus_interface_skeleton_export ( G_DBUS_INTERFACE_SKELETON(adapter->priv->dbus_user_service), adapter->priv->connection, GUM_USER_SERVICE_OBJECTPATH, &err)) { - ERR ("failed to register object: %s", err->message); + WARN ("failed to register object: %s", err->message); g_error_free (err); g_object_unref (adapter); return NULL; -- 2.7.4