[PATCH libXi 2/2] XIPassiveGrab: Fix completely broken locking in XIGrabTouchBegin

walter harms wharms at bfs.de
Wed Jul 9 00:23:54 PDT 2014


Am 08.07.2014 23:01, schrieb Jasper St. Pierre:
> _XIPassiveGrabDevice calls LockDisplay as the first thing it does. That
> means that it expects the display to be unlocked. XIGrabTouchBegin locks
> the display to check for the XI extension, and then never unlocks it.
> Effectively, this meant that anybody that called XIGrabTouchBegin after
> XInitThreads just got a deadlock.
> 
> Cool.
> ---
>  src/XIPassiveGrab.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/src/XIPassiveGrab.c b/src/XIPassiveGrab.c
> index f3a9924..88f1aff 100644
> --- a/src/XIPassiveGrab.c
> +++ b/src/XIPassiveGrab.c
> @@ -166,6 +166,7 @@ XIGrabTouchBegin(Display *dpy, int deviceid, Window grab_window,
>      LockDisplay(dpy);
>      if (_XiCheckExtInit(dpy, XInput_2_2, extinfo) == -1)
>  	return -1;
> +    UnlockDisplay(dpy);
>  
>      /* FIXME: allow selection of GrabMode for paired devices? */
>      return _XIPassiveGrabDevice(dpy, deviceid, XIGrabtypeTouchBegin, 0,


I am not an expert on this but you should  unlock the display on error also.
I would do it this way:

LockDisplay(dpy);
err=_XiCheckExtInit(dpy, XInput_2_2, extinfo);
UnlockDisplay(dpy);
if (err == -1)
	return -1;

jz'ust my 2 cents
re,
 wh



More information about the xorg-devel mailing list