From: Gleb Popov <6yearold@gmail.com> Date: Mon, 19 May 2025 05:39:45 +0000 (+0300) Subject: dbus-transport-socket: Handle _DBUS_POLLHUP case in socket_do_iteration X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=878f35e5fba360c643bcb42a00945c73b4a40f50;p=thirdparty%2Fdbus.git dbus-transport-socket: Handle _DBUS_POLLHUP case in socket_do_iteration Without this change the bus-normal-activation test on FreeBSD ends up with a busy-loop under one of malloc failures. Fixes #553 --- diff --git a/dbus/dbus-transport-socket.c b/dbus/dbus-transport-socket.c index d3c2b914e..1ddb5689e 100644 --- a/dbus/dbus-transport-socket.c +++ b/dbus/dbus-transport-socket.c @@ -1208,8 +1208,15 @@ socket_do_iteration (DBusTransport *transport, do_io_error (transport); else { - dbus_bool_t need_read = (poll_fd.revents & _DBUS_POLLIN) > 0; - dbus_bool_t need_write = (poll_fd.revents & _DBUS_POLLOUT) > 0; + /* FreeBSD does not deliver POLLERR when the other side gets disconnected. + * Instead it delivers POLLHUP that is not coupled with POLLIN nor POLLOUT. + * On the input side, treat this as equivalent to the POLLHUP|POLLIN we + * would see in this situation on Linux, so that we will enter + * do_reading() and detect the end-of-stream condition; and similarly, + * on the output side, treat it as equivalent to POLLHUP|POLLOUT. + */ + dbus_bool_t need_read = (poll_fd.revents & (_DBUS_POLLIN | _DBUS_POLLHUP)) > 0; + dbus_bool_t need_write = (poll_fd.revents & (_DBUS_POLLOUT | _DBUS_POLLHUP)) > 0; dbus_bool_t authentication_completed; _dbus_verbose ("in iteration, need_read=%d need_write=%d\n",