wayland/data-device: Fix crash with offer from X11 client
If a data offer comes from an X11 client, the Wayland resource would be NULL, causing a crash in `data_offer_choose_action()` trying to get the resource version. So instead of doing the version check in `data_offer_choose_action()`, do it early when creating the data source. Closes: https://gitlab.gnome.org/GNOME/mutter/issues/1057 https://gitlab.gnome.org/GNOME/mutter/merge_requests/1073
This commit is contained in:
parent
963108a9a6
commit
f9326cfa3d
@ -143,16 +143,8 @@ data_offer_choose_action (MetaWaylandDataOffer *offer)
|
|||||||
WL_DATA_OFFER_ACTION_SINCE_VERSION)
|
WL_DATA_OFFER_ACTION_SINCE_VERSION)
|
||||||
return WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
|
return WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
|
||||||
|
|
||||||
if (wl_resource_get_version (meta_wayland_data_source_get_resource (source)) <
|
actions = meta_wayland_data_source_get_actions (source);
|
||||||
WL_DATA_SOURCE_ACTION_SINCE_VERSION)
|
user_action = meta_wayland_data_source_get_user_action (source);
|
||||||
{
|
|
||||||
actions = user_action = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
actions = meta_wayland_data_source_get_actions (source);
|
|
||||||
user_action = meta_wayland_data_source_get_user_action (source);
|
|
||||||
}
|
|
||||||
|
|
||||||
available_actions = actions & offer->dnd_actions;
|
available_actions = actions & offer->dnd_actions;
|
||||||
|
|
||||||
@ -2200,11 +2192,19 @@ meta_wayland_data_source_new (struct wl_resource *resource)
|
|||||||
{
|
{
|
||||||
MetaWaylandDataSource *source =
|
MetaWaylandDataSource *source =
|
||||||
g_object_new (META_TYPE_WAYLAND_DATA_SOURCE, NULL);
|
g_object_new (META_TYPE_WAYLAND_DATA_SOURCE, NULL);
|
||||||
|
MetaWaylandDataSourcePrivate *priv =
|
||||||
|
meta_wayland_data_source_get_instance_private (source);
|
||||||
|
|
||||||
meta_wayland_data_source_set_resource (source, resource);
|
meta_wayland_data_source_set_resource (source, resource);
|
||||||
wl_resource_set_implementation (resource, &data_source_interface,
|
wl_resource_set_implementation (resource, &data_source_interface,
|
||||||
source, destroy_data_source);
|
source, destroy_data_source);
|
||||||
|
|
||||||
|
if (wl_resource_get_version (resource) < WL_DATA_SOURCE_ACTION_SINCE_VERSION)
|
||||||
|
{
|
||||||
|
priv->dnd_actions = priv->user_dnd_action =
|
||||||
|
WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
|
||||||
|
}
|
||||||
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user