summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-08-26 07:26:01 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-08-26 07:27:38 -0400
commitb6eb85ee72c228fd5f9657dce7ac7d352be57ad3 (patch)
tree59eb1df52429c91ec31f6cf9679c44fe553377de
parent44741e1b7730ab6a52dbd979901768d6e7eb33c7 (diff)
downloadgtk+-b6eb85ee72c228fd5f9657dce7ac7d352be57ad3.tar.gz
main: Avoid a crash with crossing event handling
We are reusing the GtkCrossingData struct for multiple calls here, so we need to make sure that the targets stay alive from beginning to end. Fixes: #3090
-rw-r--r--gtk/gtkmain.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index a517a0e6e7..23c61cd270 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1335,9 +1335,9 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
crossing.type = crossing_type;
crossing.mode = mode;
- crossing.old_target = old_target;
+ crossing.old_target = old_target ? g_object_ref (old_target) : NULL;
crossing.old_descendent = NULL;
- crossing.new_target = new_target;
+ crossing.new_target = new_target ? g_object_ref (new_target) : NULL;
crossing.new_descendent = NULL;
crossing.drop = drop;
@@ -1417,6 +1417,9 @@ gtk_synthesize_crossing_events (GtkRoot *toplevel,
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_PRELIGHT, FALSE);
}
+ g_clear_object (&crossing.old_target);
+ g_clear_object (&crossing.new_target);
+
gtk_widget_stack_clear (&target_array);
}