diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-08-26 07:24:54 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-08-26 07:26:49 -0400 |
commit | 44741e1b7730ab6a52dbd979901768d6e7eb33c7 (patch) | |
tree | 561990405d2917311fb18b4b995d0f01ed5f4906 | |
parent | eef1818cee6aa1ddd5c7653246fd38b71da2fe30 (diff) | |
download | gtk+-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.c | 18 |
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); } |