summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormsizanoen1 <msizanoen@qtmlabs.xyz>2022-11-06 11:38:22 +0700
committerRobert Mader <robert.mader@posteo.de>2022-12-03 09:37:38 +0000
commit5550dd1ccac4bc86cde99cfca23c592b5455320f (patch)
tree0d1e4340a33151d587c2751b7d6d7a64eac883f6
parentcddbffad4dc5521184d2803169e9006fc1aae4bd (diff)
downloadmutter-5550dd1ccac4bc86cde99cfca23c592b5455320f.tar.gz
wayland/pointer-gestures: Fix crash in get_*_gesture after pointer is destroyed
Properly handle cases where the pointer object has already been destroyed to prevent the compositor from crashing with a null pointer dereference when a client invokes a get_*_gesture method after the pointer object is destroyed e.g. when the current login session is not on foreground. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/2237 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2690> (cherry picked from commit 992e169d84d9bef3769da3b0e56bec1d77932379)
-rw-r--r--src/wayland/meta-wayland-pointer-gesture-hold.c14
-rw-r--r--src/wayland/meta-wayland-pointer-gesture-pinch.c14
-rw-r--r--src/wayland/meta-wayland-pointer-gesture-swipe.c14
3 files changed, 27 insertions, 15 deletions
diff --git a/src/wayland/meta-wayland-pointer-gesture-hold.c b/src/wayland/meta-wayland-pointer-gesture-hold.c
index 904b0654b..50007571f 100644
--- a/src/wayland/meta-wayland-pointer-gesture-hold.c
+++ b/src/wayland/meta-wayland-pointer-gesture-hold.c
@@ -123,13 +123,17 @@ meta_wayland_pointer_gesture_hold_create_new_resource (MetaWaylandPointer *point
MetaWaylandPointerClient *pointer_client;
struct wl_resource *res;
- pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
- g_return_if_fail (pointer_client != NULL);
-
res = wl_resource_create (client, &zwp_pointer_gesture_hold_v1_interface,
wl_resource_get_version (pointer_resource), id);
wl_resource_set_implementation (res, &pointer_gesture_hold_interface, pointer,
meta_wayland_pointer_unbind_pointer_client_resource);
- wl_list_insert (&pointer_client->hold_gesture_resources,
- wl_resource_get_link (res));
+
+ if (pointer)
+ {
+ pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
+ g_return_if_fail (pointer_client != NULL);
+
+ wl_list_insert (&pointer_client->hold_gesture_resources,
+ wl_resource_get_link (res));
+ }
}
diff --git a/src/wayland/meta-wayland-pointer-gesture-pinch.c b/src/wayland/meta-wayland-pointer-gesture-pinch.c
index f7b37ff27..2f068fce3 100644
--- a/src/wayland/meta-wayland-pointer-gesture-pinch.c
+++ b/src/wayland/meta-wayland-pointer-gesture-pinch.c
@@ -154,13 +154,17 @@ meta_wayland_pointer_gesture_pinch_create_new_resource (MetaWaylandPointer *poin
MetaWaylandPointerClient *pointer_client;
struct wl_resource *res;
- pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
- g_return_if_fail (pointer_client != NULL);
-
res = wl_resource_create (client, &zwp_pointer_gesture_pinch_v1_interface,
wl_resource_get_version (gestures_resource), id);
wl_resource_set_implementation (res, &pointer_gesture_pinch_interface, pointer,
meta_wayland_pointer_unbind_pointer_client_resource);
- wl_list_insert (&pointer_client->pinch_gesture_resources,
- wl_resource_get_link (res));
+
+ if (pointer)
+ {
+ pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
+ g_return_if_fail (pointer_client != NULL);
+
+ wl_list_insert (&pointer_client->pinch_gesture_resources,
+ wl_resource_get_link (res));
+ }
}
diff --git a/src/wayland/meta-wayland-pointer-gesture-swipe.c b/src/wayland/meta-wayland-pointer-gesture-swipe.c
index d95e84941..e451f93e6 100644
--- a/src/wayland/meta-wayland-pointer-gesture-swipe.c
+++ b/src/wayland/meta-wayland-pointer-gesture-swipe.c
@@ -150,13 +150,17 @@ meta_wayland_pointer_gesture_swipe_create_new_resource (MetaWaylandPointer *poin
MetaWaylandPointerClient *pointer_client;
struct wl_resource *res;
- pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
- g_return_if_fail (pointer_client != NULL);
-
res = wl_resource_create (client, &zwp_pointer_gesture_swipe_v1_interface,
wl_resource_get_version (pointer_resource), id);
wl_resource_set_implementation (res, &pointer_gesture_swipe_interface, pointer,
meta_wayland_pointer_unbind_pointer_client_resource);
- wl_list_insert (&pointer_client->swipe_gesture_resources,
- wl_resource_get_link (res));
+
+ if (pointer)
+ {
+ pointer_client = meta_wayland_pointer_get_pointer_client (pointer, client);
+ g_return_if_fail (pointer_client != NULL);
+
+ wl_list_insert (&pointer_client->swipe_gesture_resources,
+ wl_resource_get_link (res));
+ }
}