From 002376f837f7dc8f1211339523ec1c9a90304dc8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 26 Aug 2020 07:24:54 -0400 Subject: [PATCH] widget: Avoid a crash in crossing event handling We need to make sure that the crossing data stays alive until we are done handling it, so take references on all the widgets in it. --- gtk/gtkwidget.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 9f538f42ea..e8106fca84 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -4376,12 +4376,30 @@ gtk_widget_handle_crossing (GtkWidget *widget, g_object_ref (widget); + if (crossing->old_target) + g_object_ref (crossing->old_target); + if (crossing->new_target) + g_object_ref (crossing->new_target); + if (crossing->old_descendent) + g_object_ref (crossing->old_descendent); + if (crossing->new_descendent) + g_object_ref (crossing->new_descendent); + for (l = priv->event_controllers; l; l = l->next) { GtkEventController *controller = l->data; gtk_event_controller_handle_crossing (controller, crossing, x, y); } + if (crossing->old_target) + g_object_unref (crossing->old_target); + if (crossing->new_target) + g_object_unref (crossing->new_target); + if (crossing->old_descendent) + g_object_unref (crossing->old_descendent); + if (crossing->new_descendent) + g_object_unref (crossing->new_descendent); + g_object_unref (widget); }