diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2019-10-29 08:28:56 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2019-10-29 08:28:56 +0000 |
commit | 714f9f92b77bf2552ffe85aa0f4cb92f4727ba90 (patch) | |
tree | e6f3d53d4399ac72cc7341594b6ee81f5f98cfdd | |
parent | d44e00fb98a8d247af7d20d2e1123b8f8425cdfa (diff) | |
parent | 0c07e672a28f8ee740ac61921c5e86c071909475 (diff) | |
download | glib-714f9f92b77bf2552ffe85aa0f4cb92f4727ba90.tar.gz |
Merge branch '1318-dbus-server-race' into 'master'
gdbusserver: Keep a strong reference to the server in callbacks
Closes #1318
See merge request GNOME/glib!1193
-rw-r--r-- | gio/gdbusserver.c | 45 |
1 files changed, 23 insertions, 22 deletions
diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c index 26f8dadd0..4a8dab0ea 100644 --- a/gio/gdbusserver.c +++ b/gio/gdbusserver.c @@ -179,6 +179,8 @@ g_dbus_server_finalize (GObject *object) { GDBusServer *server = G_DBUS_SERVER (object); + g_assert (!server->active); + if (server->authentication_observer != NULL) g_object_unref (server->authentication_observer); @@ -197,19 +199,8 @@ g_dbus_server_finalize (GObject *object) g_free (server->nonce); } - if (server->unix_socket_path) - { - if (g_unlink (server->unix_socket_path) != 0) - g_warning ("Failed to delete %s: %s", server->unix_socket_path, g_strerror (errno)); - g_free (server->unix_socket_path); - } - - if (server->nonce_file) - { - if (g_unlink (server->nonce_file) != 0) - g_warning ("Failed to delete %s: %s", server->nonce_file, g_strerror (errno)); - g_free (server->nonce_file); - } + g_free (server->unix_socket_path); + g_free (server->nonce_file); g_main_context_unref (server->main_context_at_construction); @@ -622,6 +613,12 @@ g_dbus_server_start (GDBusServer *server) return; /* Right now we don't have any transport not using the listener... */ g_assert (server->is_using_listener); + server->run_signal_handler_id = g_signal_connect_data (G_SOCKET_SERVICE (server->listener), + "run", + G_CALLBACK (on_run), + g_object_ref (server), + (GClosureNotify) g_object_unref, + 0 /* flags */); g_socket_service_start (G_SOCKET_SERVICE (server->listener)); server->active = TRUE; g_object_notify (G_OBJECT (server), "active"); @@ -648,6 +645,18 @@ g_dbus_server_stop (GDBusServer *server) g_socket_service_stop (G_SOCKET_SERVICE (server->listener)); server->active = FALSE; g_object_notify (G_OBJECT (server), "active"); + + if (server->unix_socket_path) + { + if (g_unlink (server->unix_socket_path) != 0) + g_warning ("Failed to delete %s: %s", server->unix_socket_path, g_strerror (errno)); + } + + if (server->nonce_file) + { + if (g_unlink (server->nonce_file) != 0) + g_warning ("Failed to delete %s: %s", server->nonce_file, g_strerror (errno)); + } } /* ---------------------------------------------------------------------------------------------------- */ @@ -1159,15 +1168,7 @@ initable_init (GInitable *initable, if (ret) { - if (last_error != NULL) - g_error_free (last_error); - - /* Right now we don't have any transport not using the listener... */ - g_assert (server->is_using_listener); - server->run_signal_handler_id = g_signal_connect (G_SOCKET_SERVICE (server->listener), - "run", - G_CALLBACK (on_run), - server); + g_clear_error (&last_error); } else { |