summaryrefslogtreecommitdiff
path: root/dbus/dbus-server.c
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2017-11-21 14:38:13 +0000
committerSimon McVittie <smcv@collabora.com>2017-11-24 12:17:26 +0000
commit0c03b505a9718c6d497caffb7d6083371679a852 (patch)
tree4fbe5e4069e94f83d87b9246c369e571bad11131 /dbus/dbus-server.c
parent1ce34beef85a7a0b3c25890837e3a72f8bdac1f0 (diff)
downloaddbus-0c03b505a9718c6d497caffb7d6083371679a852.tar.gz
_dbus_server_new_for_socket: Properly disconnect during error unwinding
_dbus_server_finalize_base() asserts that the socket has been disconnected, but in some OOM code paths we would call it without officially disconnecting. Do so. This means we need to be a bit more careful about what is socket_disconnect()'s responsibility to clean up, what is _dbus_server_new_for_socket()'s responsibility, and what is the caller's responsibility. Signed-off-by: Simon McVittie <smcv@collabora.com> Reviewed-by: Philip Withnall <withnall@endlessm.com> Bug: https://bugs.freedesktop.org/show_bug.cgi?id=89104
Diffstat (limited to 'dbus/dbus-server.c')
-rw-r--r--dbus/dbus-server.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/dbus/dbus-server.c b/dbus/dbus-server.c
index ea9aff2d..d91df832 100644
--- a/dbus/dbus-server.c
+++ b/dbus/dbus-server.c
@@ -764,6 +764,20 @@ dbus_server_unref (DBusServer *server)
}
}
+void
+_dbus_server_disconnect_unlocked (DBusServer *server)
+{
+ _dbus_assert (server->vtable->disconnect != NULL);
+
+ if (!server->disconnected)
+ {
+ /* this has to be first so recursive calls to disconnect don't happen */
+ server->disconnected = TRUE;
+
+ (* server->vtable->disconnect) (server);
+ }
+}
+
/**
* Releases the server's address and stops listening for
* new clients. If called more than once, only the first
@@ -780,15 +794,7 @@ dbus_server_disconnect (DBusServer *server)
dbus_server_ref (server);
SERVER_LOCK (server);
- _dbus_assert (server->vtable->disconnect != NULL);
-
- if (!server->disconnected)
- {
- /* this has to be first so recursive calls to disconnect don't happen */
- server->disconnected = TRUE;
-
- (* server->vtable->disconnect) (server);
- }
+ _dbus_server_disconnect_unlocked (server);
SERVER_UNLOCK (server);
dbus_server_unref (server);