diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2019-10-08 17:50:48 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2019-10-08 17:59:43 +0200 |
commit | bcd384711aab713d9928eb08fa0d1281b66bd659 (patch) | |
tree | 9b8f631c12bbd31db5e91612aef6a8553444038f | |
parent | d70f85d6b9e5bc8d0e9890eda55d05a2510f0037 (diff) | |
download | gtk+-bcd384711aab713d9928eb08fa0d1281b66bd659.tar.gz |
gdk: Avoid poking possibly freed memory
The event may end up freed after delivery, ensure to keep the data we need
in order to emit the matching emulated crossed event matching a proximity
event.
Closes: https://gitlab.gnome.org/GNOME/gtk/issues/2157
-rw-r--r-- | gdk/wayland/gdkdevice-wayland.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c index fa292d25a7..4773f63ffa 100644 --- a/gdk/wayland/gdkdevice-wayland.c +++ b/gdk/wayland/gdkdevice-wayland.c @@ -3468,6 +3468,8 @@ static void gdk_wayland_tablet_flush_frame_event (GdkWaylandTabletData *tablet, guint32 time) { + GdkEventType event_type; + GdkWindow *window; GdkEvent *event; event = tablet->pointer_info.frame.event; @@ -3476,7 +3478,10 @@ gdk_wayland_tablet_flush_frame_event (GdkWaylandTabletData *tablet, if (!event) return; - switch (event->type) + event_type = event->type; + window = g_object_ref (gdk_event_get_window (event)); + + switch (event_type) { case GDK_MOTION_NOTIFY: event->motion.time = time; @@ -3504,18 +3509,20 @@ gdk_wayland_tablet_flush_frame_event (GdkWaylandTabletData *tablet, return; } - if (event->type == GDK_PROXIMITY_OUT) - emulate_crossing (event->proximity.window, NULL, tablet->master, + if (event_type == GDK_PROXIMITY_OUT) + emulate_crossing (window, NULL, tablet->master, tablet->current_device, GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, time); _gdk_wayland_display_deliver_event (gdk_seat_get_display (tablet->seat), event); - if (event->type == GDK_PROXIMITY_IN) - emulate_crossing (event->proximity.window, NULL, tablet->master, + if (event_type == GDK_PROXIMITY_IN) + emulate_crossing (window, NULL, tablet->master, tablet->current_device, GDK_ENTER_NOTIFY, GDK_CROSSING_NORMAL, time); + + g_object_unref (window); } static GdkEvent * |