data-device: Protect against destroyed dnd-focus clients
When a possible drag dest client crashes during DnD, it may happen we receive first the destroy notification for the data_device, and later the notification for the focus surface. When this happens we unset the drag_focus_data_device first, and later on meta_wayland_drag_grab_set_focus(grab, NULL) we assume it still exists when sending the leave event, leading to mutter crashing right after. So, as we don't receive any ordering guarantees about resource destruction, just prepare the meta_wayland_drag_grab_set_focus() paths for this.
This commit is contained in:
parent
8da5761ffc
commit
ea4979e182
@ -543,6 +543,9 @@ meta_wayland_drag_dest_focus_in (MetaWaylandDataDevice *data_device,
|
|||||||
struct wl_client *client;
|
struct wl_client *client;
|
||||||
wl_fixed_t sx, sy;
|
wl_fixed_t sx, sy;
|
||||||
|
|
||||||
|
if (!grab->drag_focus_data_device)
|
||||||
|
return;
|
||||||
|
|
||||||
client = wl_resource_get_client (surface->resource);
|
client = wl_resource_get_client (surface->resource);
|
||||||
display = wl_client_get_display (client);
|
display = wl_client_get_display (client);
|
||||||
|
|
||||||
@ -563,7 +566,8 @@ meta_wayland_drag_dest_focus_out (MetaWaylandDataDevice *data_device,
|
|||||||
{
|
{
|
||||||
MetaWaylandDragGrab *grab = data_device->current_grab;
|
MetaWaylandDragGrab *grab = data_device->current_grab;
|
||||||
|
|
||||||
wl_data_device_send_leave (grab->drag_focus_data_device);
|
if (grab->drag_focus_data_device)
|
||||||
|
wl_data_device_send_leave (grab->drag_focus_data_device);
|
||||||
|
|
||||||
wl_list_remove (&grab->drag_focus_listener.link);
|
wl_list_remove (&grab->drag_focus_listener.link);
|
||||||
grab->drag_focus_data_device = NULL;
|
grab->drag_focus_data_device = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user