summaryrefslogtreecommitdiff
path: root/glamor
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2016-05-26 19:01:59 +0900
committerMichel Dänzer <michel@daenzer.net>2016-05-30 17:49:32 +0900
commit5ff75da317539e87cca429185d710d0eeb9d9222 (patch)
tree0743a17ddd16c1f4d2392435e15bd386424ba3e6 /glamor
parent84e0d5d63c393fc36e91433cd7897e776e82528c (diff)
glamor: Cannot use copies when accessing outside of composite source
Commit b64108fa ("glamor: Check for composite operations which are equivalent to copies") failed to copy conditions from exaComposite which ensure that the composite operation doesn't access outside of the source picture. This fixes rendercheck regressions from the commit above. Reviewed-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'glamor')
-rw-r--r--glamor/glamor_render.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c
index 165bcede6..64141ac0f 100644
--- a/glamor/glamor_render.c
+++ b/glamor/glamor_render.c
@@ -1424,18 +1424,21 @@ glamor_composite_clipped_region(CARD8 op,
if (!mask && !source->alphaMap && !dest->alphaMap
&& source->pDrawable && !source->transform
&& ((op == PictOpSrc
- && ((source->format == dest->format
- || (PICT_FORMAT_COLOR(dest->format)
- && PICT_FORMAT_COLOR(source->format)
- && dest->format == PICT_FORMAT(PICT_FORMAT_BPP(source->format),
- PICT_FORMAT_TYPE(source->format),
- 0,
- PICT_FORMAT_R(source->format),
- PICT_FORMAT_G(source->format),
- PICT_FORMAT_B(source->format))))
- || (op == PictOpOver
- && source->format == dest->format
- && !PICT_FORMAT_A(source->format)))))) {
+ && (source->format == dest->format
+ || (PICT_FORMAT_COLOR(dest->format)
+ && PICT_FORMAT_COLOR(source->format)
+ && dest->format == PICT_FORMAT(PICT_FORMAT_BPP(source->format),
+ PICT_FORMAT_TYPE(source->format),
+ 0,
+ PICT_FORMAT_R(source->format),
+ PICT_FORMAT_G(source->format),
+ PICT_FORMAT_B(source->format)))))
+ || (op == PictOpOver
+ && source->format == dest->format
+ && !PICT_FORMAT_A(source->format)))
+ && x_source >= 0 && y_source >= 0
+ && (x_source + width) <= source->pDrawable->width
+ && (y_source + height) <= source->pDrawable->height) {
x_source += source->pDrawable->x;
y_source += source->pDrawable->y;
x_dest += dest->pDrawable->x;