summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2015-03-20 15:09:37 +0800
committerJonas Ådahl <jadahl@gmail.com>2015-03-31 15:09:13 +0800
commitdbca3337b2ce81cb13c58adb9c10d258cdc79f67 (patch)
tree60424d4d9e43f9568eec437d3b011d6087170411
parent939f7ce781dd2fc67c75ed4049d3ffaa76ca641b (diff)
wayland: Fix damage of infinite regions
To avoid integer overflow when scaling "infinite" regions (0, 0) (INT32_MAX, INT32_MAX), intersect with the surface rect before scaling, instead of intersecting with the buffer rect afterwards. https://bugzilla.gnome.org/show_bug.cgi?id=746510
-rw-r--r--src/wayland/meta-wayland-surface.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 5dfa8fb4..d6da2dcf 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -121,24 +121,30 @@ static void
surface_process_damage (MetaWaylandSurface *surface,
cairo_region_t *region)
{
+ unsigned int buffer_width;
+ unsigned int buffer_height;
+ cairo_rectangle_int_t surface_rect;
cairo_region_t *scaled_region;
- cairo_rectangle_int_t buffer_rect;
int i, n_rectangles;
if (!surface->buffer)
return;
- buffer_rect.x = 0;
- buffer_rect.y = 0;
- buffer_rect.width = cogl_texture_get_width (surface->buffer->texture);
- buffer_rect.height = cogl_texture_get_height (surface->buffer->texture);
+ /* Intersect the damage region with the surface region before scaling in
+ * order to avoid integer overflow when scaling a damage region is too large
+ * (for example INT32_MAX which mesa passes). */
+ buffer_width = cogl_texture_get_width (surface->buffer->texture);
+ buffer_height = cogl_texture_get_height (surface->buffer->texture);
+ surface_rect = (cairo_rectangle_int_t) {
+ .width = buffer_width / surface->scale,
+ .height = buffer_height / surface->scale,
+ };
+ cairo_region_intersect_rectangle (region, &surface_rect);
/* The damage region must be in the same coordinate space as the buffer,
* i.e. scaled with surface->scale. */
scaled_region = meta_region_scale (region, surface->scale);
- cairo_region_intersect_rectangle (scaled_region, &buffer_rect);
-
/* First update the buffer. */
meta_wayland_buffer_process_damage (surface->buffer, scaled_region);