diff options
author | Simon McVittie <smcv@collabora.com> | 2017-11-21 14:38:13 +0000 |
---|---|---|
committer | Simon McVittie <smcv@collabora.com> | 2017-11-24 12:17:26 +0000 |
commit | 0c03b505a9718c6d497caffb7d6083371679a852 (patch) | |
tree | 4fbe5e4069e94f83d87b9246c369e571bad11131 /dbus/dbus-server.c | |
parent | 1ce34beef85a7a0b3c25890837e3a72f8bdac1f0 (diff) | |
download | dbus-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.c | 24 |
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); |