summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-08-26 07:24:54 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-08-26 07:26:49 -0400
commit44741e1b7730ab6a52dbd979901768d6e7eb33c7 (patch)
tree561990405d2917311fb18b4b995d0f01ed5f4906
parenteef1818cee6aa1ddd5c7653246fd38b71da2fe30 (diff)
downloadgtk+-44741e1b7730ab6a52dbd979901768d6e7eb33c7.tar.gz
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.
-rw-r--r--gtk/gtkwidget.c18
1 files changed, 18 insertions, 0 deletions
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);
}