summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2019-10-29 08:28:56 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2019-10-29 08:28:56 +0000
commit714f9f92b77bf2552ffe85aa0f4cb92f4727ba90 (patch)
treee6f3d53d4399ac72cc7341594b6ee81f5f98cfdd
parentd44e00fb98a8d247af7d20d2e1123b8f8425cdfa (diff)
parent0c07e672a28f8ee740ac61921c5e86c071909475 (diff)
downloadglib-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.c45
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
{