[PATCH xserver] was: Re: Two long-standing server bugs

Peter Hutterer peter.hutterer at who-t.net
Tue Sep 3 23:05:51 PDT 2013


On Tue, Sep 03, 2013 at 09:47:28AM +0200, Thomas Klausner wrote:
> On Sun, Sep 01, 2013 at 01:37:31PM -0400, der Mouse wrote:
> > The first is that CreateCursor (Xlib call XCreatePixmapCursor) with a
> > non-bitmap source pixmap and a None mask is, as I read it, supposed to
> > error out with BadMatch, but doesn't.  This is the one I fixed.
> > 
> > The second is that pixmap cursors created with a None mask get
> > extended, in some cases, to the right with additional pixels in the
> > background colour, usually to a multiple of 32 pixels.  I don't know
> > exactly when this happens; in my experience it correlates (almost?)
> > perfectly with using video hardware that's behind a PCI bus, though I
> > feel reasonably sure that it's more a question of which ddx device code
> > is in use.  This is not, strictly, contrary to the spec, since cursors
> > "may be transformed arbitrarily to meet display limitations", but,
> > since it works correctly (in the cases I've seen) when the client
> > specifies a mask pixmap full of 1s, there clearly is no actual need to
> > mangle cursors specified with a mask of None this way.  So I think
> > calling it a bug is fair.  This is the one I kinda-sorta fixed.
> > 
> > Here are my patches.  Pathnames are based on NetBSD's /usr/xsrc; I
> > trust people here can adapt as necessary. :-)  Anyone is welcome to
> > pick these up, either to be fed back into the main tree or for private
> > use, as desired.  (In case an explicit statement to this effect is
> > helpful, I release any intellectual property rights I may have in these
> > patches into the public domain.)
> > 
> > First, the `missing BadMatch' bug.
> > 
> > --- a/external/mit/xorg-server/dist/dix/dispatch.c
> > +++ b/external/mit/xorg-server/dist/dix/dispatch.c
> > @@ -2863,9 +2863,10 @@ ProcCreateCursor (ClientPtr client)
> >      }
> >      else if (  src->drawable.width != msk->drawable.width
> >  	    || src->drawable.height != msk->drawable.height
> > -	    || src->drawable.depth != 1
> >  	    || msk->drawable.depth != 1)
> >  	return (BadMatch);
> > +    if (src->drawable.depth != 1)
> > +	return (BadMatch);
> >  
> >      width = src->drawable.width;
> >      height = src->drawable.height;
> 
> I've adapted this patch to the current xserver git sources, attached.
> Please review.
>  Thomas

> From 8057fc810fb2815ea4c069ac9c1bc77709afb778 Mon Sep 17 00:00:00 2001
> From: Thomas Klausner <wiz at NetBSD.org>
> Date: Tue, 3 Sep 2013 09:44:18 +0200
> Subject: [PATCH:xserver] Fix bug in cursor handling.
> 
> CreateCursor (Xlib call XCreatePixmapCursor) with a non-bitmap
> source pixmap and a None mask is supposed to error out with BadMatch,
> but didn't.
> 
> From der Mouse <mouse at Rodents-Montreal.ORG>
> 
> Signed-off-by: Thomas Klausner <wiz at NetBSD.org>
> ---
>  dix/dispatch.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 51d0de2..ae3b97b 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -2874,9 +2874,12 @@ ProcCreateCursor(ClientPtr client)
>      }
>      else if (src->drawable.width != msk->drawable.width
>               || src->drawable.height != msk->drawable.height
> -             || src->drawable.depth != 1 || msk->drawable.depth != 1)
> +             || msk->drawable.depth != 1)
>          return BadMatch;
>  
> +    if (src->drawable.depth != 1)
> +        return (BadMatch);
> +

I'm staring hard at this and struggling to see the change. The previous code
already returned BadMatch for a src depth of != 1. 

Cheers,
   Peter

>      width = src->drawable.width;
>      height = src->drawable.height;
>  
> -- 
> 1.8.4
> 


More information about the xorg-devel mailing list