summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <smcv@collabora.com>2020-02-20 00:36:53 +0000
committerSimon McVittie <smcv@collabora.com>2020-02-20 12:24:19 +0000
commit3643fd256b027a3cd4c97e47c90a89a4ad824e35 (patch)
tree73986680940edb2647a89522f4a2e7bf5feb5626
parent9e2c979e3e251174524b6462355abd3d69fa2084 (diff)
downloaddbus-3643fd256b027a3cd4c97e47c90a89a4ad824e35.tar.gz
bus: Don't explicitly clear BusConnections.monitors
Each connection that is an active monitor holds a pointer to its own link in this list, via BusConnectionData.link_in_monitors. We can't validly free the list while these pointers exist: that would be a use-after-free, when each connection gets disconnected and tries to remove itself from the list. Instead, let each connection remove itself from the list, then assert that the list has become empty. Signed-off-by: Simon McVittie <smcv@collabora.com>
-rw-r--r--bus/connection.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/bus/connection.c b/bus/connection.c
index 31ed6be7..05daa6a4 100644
--- a/bus/connection.c
+++ b/bus/connection.c
@@ -540,9 +540,6 @@ bus_connections_unref (BusConnections *connections)
_dbus_assert (connections->n_incomplete == 0);
- /* drop all monitors */
- _dbus_list_clear (&connections->monitors);
-
/* drop all real connections */
while (connections->completed != NULL)
{
@@ -558,6 +555,10 @@ bus_connections_unref (BusConnections *connections)
_dbus_assert (connections->n_completed == 0);
+ /* disconnecting all the connections should have emptied the list of
+ * monitors (each link is removed in bus_connection_disconnected) */
+ _dbus_assert (connections->monitors == NULL);
+
bus_expire_list_free (connections->pending_replies);
_dbus_loop_remove_timeout (bus_context_get_loop (connections->context),