diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-08-26 07:26:01 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-08-26 07:27:38 -0400 |
commit | b6eb85ee72c228fd5f9657dce7ac7d352be57ad3 (patch) | |
tree | 59eb1df52429c91ec31f6cf9679c44fe553377de | |
parent | 44741e1b7730ab6a52dbd979901768d6e7eb33c7 (diff) | |
download | gtk+-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.c | 7 |
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); } |