summaryrefslogtreecommitdiff
path: root/src/cairo-quartz-surface.c
diff options
context:
space:
mode:
authorJeff Muizelaar <jrmuizel@gmail.com>2022-06-29 11:41:47 -0400
committerJeff Muizelaar <jrmuizel@gmail.com>2022-06-29 21:30:08 -0400
commitcccc81ccba99600483621e02ae9438a4a5a3d024 (patch)
tree0c3786d7dba72944226c1559ace75a582d0de583 /src/cairo-quartz-surface.c
parentf408ae9269c9e45dcf48b9b2e466dee4b3b2771e (diff)
downloadcairo-cccc81ccba99600483621e02ae9438a4a5a3d024.tar.gz
quartz: Avoid reading beyond the end of image surfaces.
The last row of data may have less than stride bytes so make sure we only copy what we need.
Diffstat (limited to 'src/cairo-quartz-surface.c')
-rw-r--r--src/cairo-quartz-surface.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/cairo-quartz-surface.c b/src/cairo-quartz-surface.c
index 97ddf2c28..6676dc960 100644
--- a/src/cairo-quartz-surface.c
+++ b/src/cairo-quartz-surface.c
@@ -772,8 +772,12 @@ _cairo_surface_to_cgimage (cairo_surface_t *source,
return _cairo_error (CAIRO_STATUS_NO_MEMORY);
}
+ // The last row of data may have less than stride bytes so make sure we
+ // only copy the minimum amount required from that row.
memcpy (image_data, image_surface->data,
- image_surface->height * image_surface->stride);
+ (image_surface->height - 1) * image_surface->stride +
+ cairo_format_stride_for_width (image_surface->format,
+ image_surface->width));
*image_out = CairoQuartzCreateCGImage (image_surface->format,
image_surface->width,
image_surface->height,