[PATCH] xfixes: Forbid manipulating clip for source-only pictures (#28968)
Hans de Goede
hdegoede at redhat.com
Fri Apr 18 02:49:40 PDT 2014
Hi,
On 04/10/2014 05:34 PM, Adam Jackson wrote:
> Just throw BadPicture instead of crashing. It's not currently a
> meaningful thing to do anyway, RenderSetPictureRectangles would error if
> you tried (which this patch changes to BadPicture as well for
> consistency). The problem with trying to do it is if the clip is
> specified as a pixmap then we try to convert it to a region, and
> ->BitmapToRegion requires a ScreenPtr, and source-only pictures don't
> have one.
>
> I can imagine a use for client clip on source-only pictures, so if we
> really wanted to allow this, probably the way forward is to always store
> the clip as a region internally, and when setting the clip _from_ a
> pixmap, look up BitmapToRegion relative to the pixmap not the picture.
> But since clearly nobody can be relying on it working...
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
Looks good.
Reviewed-by: Hans de Goede <hdegoede at redhat.com>
Regards,
Hans
> ---
> render/render.c | 2 +-
> xfixes/region.c | 6 ++++++
> 2 files changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/render/render.c b/render/render.c
> index 3b7151a..9ac4a98 100644
> --- a/render/render.c
> +++ b/render/render.c
> @@ -638,7 +638,7 @@ ProcRenderSetPictureClipRectangles(ClientPtr client)
> REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq);
> VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
> if (!pPicture->pDrawable)
> - return BadDrawable;
> + return RenderErrBase + BadPicture;
>
> nr = (client->req_len << 2) - sizeof(xRenderSetPictureClipRectanglesReq);
> if (nr & 4)
> diff --git a/xfixes/region.c b/xfixes/region.c
> index cc8f1a5..f9de525 100644
> --- a/xfixes/region.c
> +++ b/xfixes/region.c
> @@ -269,6 +269,9 @@ ProcXFixesCreateRegionFromPicture(ClientPtr client)
>
> VERIFY_PICTURE(pPicture, stuff->picture, client, DixGetAttrAccess);
>
> + if (!pPicture->pDrawable)
> + return RenderErrBase + BadPicture;
> +
> switch (pPicture->clientClipType) {
> case CT_PIXMAP:
> pRegion = BitmapToRegion(pPicture->pDrawable->pScreen,
> @@ -750,6 +753,9 @@ ProcXFixesSetPictureClipRegion(ClientPtr client)
> VERIFY_PICTURE(pPicture, stuff->picture, client, DixSetAttrAccess);
> VERIFY_REGION_OR_NONE(pRegion, stuff->region, client, DixReadAccess);
>
> + if (!pPicture->pDrawable)
> + return RenderErrBase + BadPicture;
> +
> return SetPictureClipRegion(pPicture, stuff->xOrigin, stuff->yOrigin,
> pRegion);
> }
>
More information about the xorg-devel
mailing list