Diff between 907772ece72a1f4155f0c3831aef8b9a314ffa3b and 4f589213525a15177ff2a6a9e231b822219fc368

Changed Files

File Additions Deletions Status
gdbus/mainloop.c +8 -2 modified

Full Patch

diff --git a/gdbus/mainloop.c b/gdbus/mainloop.c
index 435fb93..3e88eac 100644
--- a/gdbus/mainloop.c
+++ b/gdbus/mainloop.c
@@ -88,16 +88,22 @@ static gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
 	struct watch_info *info = data;
 	unsigned int flags = 0;
 	DBusDispatchStatus status;
+	DBusConnection *conn;
 
 	if (cond & G_IO_IN)  flags |= DBUS_WATCH_READABLE;
 	if (cond & G_IO_OUT) flags |= DBUS_WATCH_WRITABLE;
 	if (cond & G_IO_HUP) flags |= DBUS_WATCH_HANGUP;
 	if (cond & G_IO_ERR) flags |= DBUS_WATCH_ERROR;
 
+	/* Protect connection from being destroyed by dbus_watch_handle */
+	conn = dbus_connection_ref(info->conn);
+
 	dbus_watch_handle(info->watch, flags);
 
-	status = dbus_connection_get_dispatch_status(info->conn);
-	queue_dispatch(info->conn, status);
+	status = dbus_connection_get_dispatch_status(conn);
+	queue_dispatch(conn, status);
+
+	dbus_connection_unref(conn);
 
 	return TRUE;
 }