[gtk/gtk-3-24: 1/2] wayland/cursor: Sanity check cursor image size
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/gtk-3-24: 1/2] wayland/cursor: Sanity check cursor image size
- Date: Fri, 27 May 2022 11:02:23 +0000 (UTC)
commit da4066774b926880631af099469d308714b5606c
Author: Robert Mader <robert mader posteo de>
Date: Fri Jan 14 20:28:52 2022 +0100
wayland/cursor: Sanity check cursor image size
On Wayland it is a protocol violation to upload buffers with
dimensions that are not an integer multiple of the buffer scale.
Until recently, Mutter did not enforce this. When it started
doing so, some users started seeing crashes in GTK apps because the
cursor theme ended up with e.g. a 15x16 pixel image at scale of 2.
Add a small sanity check for this case.
gdk/wayland/gdkcursor-wayland.c | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
---
diff --git a/gdk/wayland/gdkcursor-wayland.c b/gdk/wayland/gdkcursor-wayland.c
index a976c4819a..f5aa4681e3 100644
--- a/gdk/wayland/gdkcursor-wayland.c
+++ b/gdk/wayland/gdkcursor-wayland.c
@@ -223,6 +223,7 @@ _gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
if (wayland_cursor->wl_cursor)
{
struct wl_cursor_image *image;
+ int cursor_scale;
if (image_index >= wayland_cursor->wl_cursor->image_count)
{
@@ -234,12 +235,22 @@ _gdk_wayland_cursor_get_buffer (GdkCursor *cursor,
image = wayland_cursor->wl_cursor->images[image_index];
- *hotspot_x = image->hotspot_x / wayland_cursor->scale;
- *hotspot_y = image->hotspot_y / wayland_cursor->scale;
+ cursor_scale = wayland_cursor->scale;
+ if ((image->width % cursor_scale != 0) ||
+ (image->height % cursor_scale != 0))
+ {
+ g_warning (G_STRLOC " cursor image size (%dx%d) not an integer"
+ "multiple of scale (%d)", image->width, image->height,
+ cursor_scale);
+ cursor_scale = 1;
+ }
+
+ *hotspot_x = image->hotspot_x / cursor_scale;
+ *hotspot_y = image->hotspot_y / cursor_scale;
- *w = image->width / wayland_cursor->scale;
- *h = image->height / wayland_cursor->scale;
- *scale = wayland_cursor->scale;
+ *w = image->width / cursor_scale;
+ *h = image->height / cursor_scale;
+ *scale = cursor_scale;
return wl_cursor_image_get_buffer (image);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]