[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

X Strike Force X.Org X11 SVN commit: r4082 - in trunk/lib/libxi/debian: . patches



Author: jamey
Date: 2006-11-27 15:11:17 -0500 (Mon, 27 Nov 2006)
New Revision: 4082

Added:
   trunk/lib/libxi/debian/patches/00_upstream_000_XInput_find_display-XiGetExtensionVersion.diff
   trunk/lib/libxi/debian/patches/00_upstream_001_XInput_find_display-XiCheckExtInit.diff
   trunk/lib/libxi/debian/patches/00_upstream_002_XiCheckExtInit_unlockdisplay.diff
Modified:
   trunk/lib/libxi/debian/changelog
   trunk/lib/libxi/debian/patches/series
Log:
Add upstream patch to fix bug #400442.

Modified: trunk/lib/libxi/debian/changelog
===================================================================
--- trunk/lib/libxi/debian/changelog	2006-11-27 19:45:16 UTC (rev 4081)
+++ trunk/lib/libxi/debian/changelog	2006-11-27 20:11:17 UTC (rev 4082)
@@ -1,3 +1,9 @@
+libxi (1:1.0.1-4) UNRELEASED; urgency=low
+
+  * libXi: Various Display locking correctness issues (Closes: #400442)
+
+ -- Jamey Sharp <sharpone@debian.org>  Mon, 27 Nov 2006 12:09:00 -0800
+
 libxi (1:1.0.1-3) unstable; urgency=low
 
   * Bring X11R7.1 into unstable.  Still closes #377204.

Added: trunk/lib/libxi/debian/patches/00_upstream_000_XInput_find_display-XiGetExtensionVersion.diff
===================================================================
--- trunk/lib/libxi/debian/patches/00_upstream_000_XInput_find_display-XiGetExtensionVersion.diff	                        (rev 0)
+++ trunk/lib/libxi/debian/patches/00_upstream_000_XInput_find_display-XiGetExtensionVersion.diff	2006-11-27 20:11:17 UTC (rev 4082)
@@ -0,0 +1,66 @@
+From: Jamey Sharp <jamey@minilop.net>
+Date: Sun, 15 Oct 2006 07:03:57 +0000 (-0700)
+Subject: Don't call XInput_find_display in _XiGetExtensionVersion, while the Display lock ...
+X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/lib/libXi.git;a=commitdiff;h=5dda1e1509d40ef64ebc816ce538cef462a4fa51
+
+Don't call XInput_find_display in _XiGetExtensionVersion, while the Display lock is held.
+
+_XiGetExtensionVersion has two callers. One had already called
+XInput_find_display, and the other could easily do so outside the
+Display lock. So I change the _XiGetExtensionVersion interface to
+accept a previously-computed XExtDisplayInfo from the caller.
+Besides being more correct, this should be slightly faster. :-)
+
+Thanks to Magnus Kessler <Magnus.Kessler@gmx.net> for identifying
+the bug and proposing a workaround.
+---
+
+--- a/src/XExtInt.c
++++ b/src/XExtInt.c
+@@ -207,7 +207,7 @@ _XiCheckExtInit(dpy, version_index)
+ 	    return (-1);
+ 	}
+ 	((XInputData *) info->data)->vers =
+-	    _XiGetExtensionVersion(dpy, "XInputExtension");
++	    _XiGetExtensionVersion(dpy, "XInputExtension", info);
+     }
+ 
+     if (versions[version_index].major_version > Dont_Check) {
+--- a/src/XGetVers.c
++++ b/src/XGetVers.c
+@@ -64,9 +64,10 @@ XExtensionVersion *
+ XGetExtensionVersion(register Display * dpy, _Xconst char *name)
+ {
+     XExtensionVersion *ext;
++    XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    ext = _XiGetExtensionVersion(dpy, name);
++    ext = _XiGetExtensionVersion(dpy, name, info);
+     if (ext != (XExtensionVersion *) NoSuchExtension) {
+ 	UnlockDisplay(dpy);
+ 	SyncHandle();
+@@ -75,12 +76,11 @@ XGetExtensionVersion(register Display * 
+ }
+ 
+ XExtensionVersion *
+-_XiGetExtensionVersion(register Display * dpy, _Xconst char *name)
++_XiGetExtensionVersion(register Display * dpy, _Xconst char *name, XExtDisplayInfo *info)
+ {
+     xGetExtensionVersionReq *req;
+     xGetExtensionVersionReply rep;
+     XExtensionVersion *ext;
+-    XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     if (_XiCheckExtInit(dpy, Dont_Check) == -1)
+ 	return ((XExtensionVersion *) NoSuchExtension);
+--- a/src/XIint.h
++++ b/src/XIint.h
+@@ -12,6 +12,6 @@ extern XExtDisplayInfo *XInput_find_disp
+ 
+ extern int _XiCheckExtInit(Display *, int);
+ 
+-extern XExtensionVersion *_XiGetExtensionVersion(Display *, _Xconst char *);
++extern XExtensionVersion *_XiGetExtensionVersion(Display *, _Xconst char *, XExtDisplayInfo *);
+ 
+ #endif

Added: trunk/lib/libxi/debian/patches/00_upstream_001_XInput_find_display-XiCheckExtInit.diff
===================================================================
--- trunk/lib/libxi/debian/patches/00_upstream_001_XInput_find_display-XiCheckExtInit.diff	                        (rev 0)
+++ trunk/lib/libxi/debian/patches/00_upstream_001_XInput_find_display-XiCheckExtInit.diff	2006-11-27 20:11:17 UTC (rev 4082)
@@ -0,0 +1,418 @@
+From: Jamey Sharp <jamey@minilop.net>
+Date: Sun, 15 Oct 2006 07:26:21 +0000 (-0700)
+Subject: Don't call XInput_find_display in _XiCheckExtInit, while the Display lock is held.
+X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/lib/libXi.git;a=commitdiff;h=c27e00ceceed3fea011c98c0e70ab568bf0687c6
+
+Don't call XInput_find_display in _XiCheckExtInit, while the Display lock is held.
+
+All callers of _XiCheckExtInit have already called XInput_find_display
+first outside the lock, so just pass their copy of the XExtDisplayInfo
+structure down. Besides being more correct, this should be slightly
+faster. :-)
+
+Thanks to Magnus Kessler <Magnus.Kessler@gmx.net> for identifying
+the bug and proposing a workaround.
+---
+
+--- a/src/XAllowDv.c
++++ b/src/XAllowDv.c
+@@ -71,7 +71,7 @@ XAllowDeviceEvents(dpy, dev, event_mode,
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(AllowDeviceEvents, req);
+--- a/src/XChgDCtl.c
++++ b/src/XChgDCtl.c
+@@ -74,7 +74,7 @@ XChangeDeviceControl(dpy, dev, control, 
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Add_XChangeDeviceControl) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Add_XChangeDeviceControl, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangeDeviceControl, req);
+--- a/src/XChgFCtl.c
++++ b/src/XChgFCtl.c
+@@ -73,7 +73,7 @@ XChangeFeedbackControl(dpy, dev, mask, f
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangeFeedbackControl, req);
+--- a/src/XChgKMap.c
++++ b/src/XChgKMap.c
+@@ -74,7 +74,7 @@ XChangeDeviceKeyMapping(dpy, dev, first,
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangeDeviceKeyMapping, req);
+--- a/src/XChgKbd.c
++++ b/src/XChgKbd.c
+@@ -70,7 +70,7 @@ XChangeKeyboardDevice(dpy, dev)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangeKeyboardDevice, req);
+--- a/src/XChgPnt.c
++++ b/src/XChgPnt.c
+@@ -72,7 +72,7 @@ XChangePointerDevice(dpy, dev, xaxis, ya
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangePointerDevice, req);
+--- a/src/XChgProp.c
++++ b/src/XChgProp.c
+@@ -73,7 +73,7 @@ XChangeDeviceDontPropagateList(dpy, wind
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(ChangeDeviceDontPropagateList, req);
+--- a/src/XCloseDev.c
++++ b/src/XCloseDev.c
+@@ -69,7 +69,7 @@ XCloseDevice(dpy, dev)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(CloseDevice, req);
+--- a/src/XDevBell.c
++++ b/src/XDevBell.c
+@@ -71,7 +71,7 @@ XDeviceBell(dpy, dev, feedbackclass, fee
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Add_XDeviceBell) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Add_XDeviceBell, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(DeviceBell, req);
+--- a/src/XExtInt.c
++++ b/src/XExtInt.c
+@@ -191,12 +191,12 @@ _xidevicebusy(dpy, error)
+  */
+ 
+ int
+-_XiCheckExtInit(dpy, version_index)
++_XiCheckExtInit(dpy, version_index, info)
+     register Display *dpy;
+     register int version_index;
++    XExtDisplayInfo *info;
+ {
+     XExtensionVersion *ext;
+-    XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     XInputCheckExtension(dpy, info, -1);
+ 
+--- a/src/XGMotion.c
++++ b/src/XGMotion.c
+@@ -85,7 +85,7 @@ Time stop;
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XDeviceTimeCoord *) NoSuchExtension);
+ 
+     GetReq(GetDeviceMotionEvents, req);
+--- a/src/XGetBMap.c
++++ b/src/XGetBMap.c
+@@ -81,7 +81,7 @@ XGetDeviceButtonMapping(dpy, device, map
+     xGetDeviceButtonMappingReply rep;
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(GetDeviceButtonMapping, req);
+ 
+--- a/src/XGetDCtl.c
++++ b/src/XGetDCtl.c
+@@ -78,7 +78,7 @@ XGetDeviceControl(dpy, dev, control)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Add_XChangeDeviceControl) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Add_XChangeDeviceControl, info) == -1)
+ 	return ((XDeviceControl *) NoSuchExtension);
+ 
+     GetReq(GetDeviceControl, req);
+--- a/src/XGetFCtl.c
++++ b/src/XGetFCtl.c
+@@ -78,7 +78,7 @@ XGetFeedbackControl(dpy, dev, num_feedba
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XFeedbackState *) NoSuchExtension);
+ 
+     GetReq(GetFeedbackControl, req);
+--- a/src/XGetKMap.c
++++ b/src/XGetKMap.c
+@@ -76,7 +76,7 @@ XGetDeviceKeyMapping(register Display * 
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((KeySym *) NoSuchExtension);
+ 
+     GetReq(GetDeviceKeyMapping, req);
+--- a/src/XGetMMap.c
++++ b/src/XGetMMap.c
+@@ -72,7 +72,7 @@ XGetDeviceModifierMapping(dpy, dev)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XModifierKeymap *) NoSuchExtension);
+ 
+     GetReq(GetDeviceModifierMapping, req);
+--- a/src/XGetProp.c
++++ b/src/XGetProp.c
+@@ -75,7 +75,7 @@ Window window;
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XEventClass *) NoSuchExtension);
+ 
+     GetReq(GetDeviceDontPropagateList, req);
+--- a/src/XGetVers.c
++++ b/src/XGetVers.c
+@@ -82,7 +82,7 @@ _XiGetExtensionVersion(register Display 
+     xGetExtensionVersionReply rep;
+     XExtensionVersion *ext;
+ 
+-    if (_XiCheckExtInit(dpy, Dont_Check) == -1)
++    if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
+ 	return ((XExtensionVersion *) NoSuchExtension);
+ 
+     GetReq(GetExtensionVersion, req);
+--- a/src/XGrDvBut.c
++++ b/src/XGrDvBut.c
+@@ -80,7 +80,7 @@ XGrabDeviceButton(dpy, dev, button, modi
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(GrabDeviceButton, req);
+--- a/src/XGrDvKey.c
++++ b/src/XGrDvKey.c
+@@ -80,7 +80,7 @@ XGrabDeviceKey(dpy, dev, key, modifiers,
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(GrabDeviceKey, req);
+--- a/src/XGrabDev.c
++++ b/src/XGrabDev.c
+@@ -78,7 +78,7 @@ XGrabDevice(dpy, dev, grab_window, owner
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(GrabDevice, req);
+--- a/src/XGtFocus.c
++++ b/src/XGtFocus.c
+@@ -73,7 +73,7 @@ XGetDeviceFocus(dpy, dev, focus, revert_
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(GetDeviceFocus, req);
+--- a/src/XGtSelect.c
++++ b/src/XGtSelect.c
+@@ -76,7 +76,7 @@ XGetSelectedExtensionEvents(dpy, w, this
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(GetSelectedExtensionEvents, req);
+ 
+--- a/src/XIint.h
++++ b/src/XIint.h
+@@ -10,7 +10,7 @@
+ 
+ extern XExtDisplayInfo *XInput_find_display(Display *);
+ 
+-extern int _XiCheckExtInit(Display *, int);
++extern int _XiCheckExtInit(Display *, int, XExtDisplayInfo *);
+ 
+ extern XExtensionVersion *_XiGetExtensionVersion(Display *, _Xconst char *, XExtDisplayInfo *);
+ 
+--- a/src/XListDev.c
++++ b/src/XListDev.c
+@@ -82,7 +82,7 @@ XListInputDevices(dpy, ndevices)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XDeviceInfo *) NULL);
+ 
+     GetReq(ListInputDevices, req);
+--- a/src/XOpenDev.c
++++ b/src/XOpenDev.c
+@@ -72,7 +72,7 @@ XOpenDevice(dpy, id)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XDevice *) NoSuchExtension);
+ 
+     GetReq(OpenDevice, req);
+--- a/src/XQueryDv.c
++++ b/src/XQueryDv.c
+@@ -76,7 +76,7 @@ XQueryDeviceState(dpy, dev)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return ((XDeviceState *) NoSuchExtension);
+ 
+     GetReq(QueryDeviceState, req);
+--- a/src/XSelect.c
++++ b/src/XSelect.c
+@@ -71,7 +71,7 @@ XSelectExtensionEvent(dpy, w, event_list
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(SelectExtensionEvent, req);
+ 
+--- a/src/XSetBMap.c
++++ b/src/XSetBMap.c
+@@ -75,7 +75,7 @@ XSetDeviceButtonMapping(dpy, device, map
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(SetDeviceButtonMapping, req);
+     req->reqType = info->codes->major_opcode;
+--- a/src/XSetDVal.c
++++ b/src/XSetDVal.c
+@@ -74,7 +74,7 @@ XSetDeviceValuators(dpy, dev, valuators,
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Add_XSetDeviceValuators) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Add_XSetDeviceValuators, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(SetDeviceValuators, req);
+--- a/src/XSetMMap.c
++++ b/src/XSetMMap.c
+@@ -72,7 +72,7 @@ XSetDeviceModifierMapping(dpy, dev, modm
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReqExtra(SetDeviceModifierMapping, mapSize, req);
+--- a/src/XSetMode.c
++++ b/src/XSetMode.c
+@@ -71,7 +71,7 @@ XSetDeviceMode(dpy, dev, mode)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(SetDeviceMode, req);
+--- a/src/XSndExEv.c
++++ b/src/XSndExEv.c
+@@ -81,7 +81,7 @@ XSendExtensionEvent(dpy, dev, dest, prop
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     /* call through display to find proper conversion routine */
+--- a/src/XUngrDev.c
++++ b/src/XUngrDev.c
+@@ -70,7 +70,7 @@ XUngrabDevice(dpy, dev, time)
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+ 
+     GetReq(UngrabDevice, req);
+--- a/src/XUngrDvB.c
++++ b/src/XUngrDvB.c
+@@ -73,7 +73,7 @@ XUngrabDeviceButton(dpy, dev, button, mo
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(UngrabDeviceButton, req);
+ 
+--- a/src/XUngrDvK.c
++++ b/src/XUngrDvK.c
+@@ -73,7 +73,7 @@ XUngrabDeviceKey(dpy, dev, key, modifier
+     XExtDisplayInfo *info = XInput_find_display(dpy);
+ 
+     LockDisplay(dpy);
+-    if (_XiCheckExtInit(dpy, XInput_Initial_Release) == -1)
++    if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
+ 	return (NoSuchExtension);
+     GetReq(UngrabDeviceKey, req);
+ 

Added: trunk/lib/libxi/debian/patches/00_upstream_002_XiCheckExtInit_unlockdisplay.diff
===================================================================
--- trunk/lib/libxi/debian/patches/00_upstream_002_XiCheckExtInit_unlockdisplay.diff	                        (rev 0)
+++ trunk/lib/libxi/debian/patches/00_upstream_002_XiCheckExtInit_unlockdisplay.diff	2006-11-27 20:11:17 UTC (rev 4082)
@@ -0,0 +1,45 @@
+From: Jamey Sharp <jamey@minilop.net>
+Date: Sun, 19 Nov 2006 09:04:26 +0000 (-0800)
+Subject: Bug #8663: _XiCheckExtInit must drop the Display lock in all error cases.
+X-Git-Url: http://gitweb.freedesktop.org/?p=xorg/lib/libXi.git;a=commitdiff;h=60dccd9a7be95e35b4b8c90934888efedfde84cc
+
+Bug #8663: _XiCheckExtInit must drop the Display lock in all error cases.
+---
+
+--- a/src/XExtInt.c
++++ b/src/XExtInt.c
+@@ -80,9 +80,6 @@ typedef struct _XInputData
+     XExtensionVersion *vers;
+ } XInputData;
+ 
+-#define XInputCheckExtension(dpy,i,val) \
+-  XextCheckExtension (dpy, i, xinput_extension_name, val)
+-
+ static /* const */ XExtensionHooks xinput_extension_hooks = {
+     NULL,	/* create_gc */
+     NULL,	/* copy_gc */
+@@ -183,6 +180,12 @@ _xidevicebusy(dpy, error)
+     *error = info->codes->first_error + XI_DeviceBusy;
+ }
+ 
++static int XInputCheckExtension(Display *dpy, XExtDisplayInfo *info)
++{
++    XextCheckExtension (dpy, info, xinput_extension_name, 0);
++    return 1;
++}
++
+ /***********************************************************************
+  *
+  * Check to see if the input extension is installed in the server.
+@@ -198,7 +201,10 @@ _XiCheckExtInit(dpy, version_index, info
+ {
+     XExtensionVersion *ext;
+ 
+-    XInputCheckExtension(dpy, info, -1);
++    if (!XInputCheckExtension(dpy, info)) {
++	UnlockDisplay(dpy);
++	return (-1);
++    }
+ 
+     if (info->data == NULL) {
+ 	info->data = (XPointer) Xmalloc(sizeof(XInputData));

Modified: trunk/lib/libxi/debian/patches/series
===================================================================
--- trunk/lib/libxi/debian/patches/series	2006-11-27 19:45:16 UTC (rev 4081)
+++ trunk/lib/libxi/debian/patches/series	2006-11-27 20:11:17 UTC (rev 4082)
@@ -1 +1,4 @@
+00_upstream_000_XInput_find_display-XiGetExtensionVersion.diff
+00_upstream_001_XInput_find_display-XiCheckExtInit.diff
+00_upstream_002_XiCheckExtInit_unlockdisplay.diff
 10_manpage_section.diff



Reply to: