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.
This commit is contained in:
		| @ -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; | ||||
|         } | ||||
|  | ||||
|       *w = image->width / wayland_cursor->scale; | ||||
|       *h = image->height / wayland_cursor->scale; | ||||
|       *scale = wayland_cursor->scale; | ||||
|       *hotspot_x = image->hotspot_x / cursor_scale; | ||||
|       *hotspot_y = image->hotspot_y / cursor_scale; | ||||
|  | ||||
|       *w = image->width / cursor_scale; | ||||
|       *h = image->height / cursor_scale; | ||||
|       *scale = cursor_scale; | ||||
|  | ||||
|       return wl_cursor_image_get_buffer (image); | ||||
|     } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Robert Mader
					Robert Mader