libxi: Changes to 'upstream-unstable'
configure.ac | 2 +-
src/XExtInt.c | 2 +-
src/XGMotion.c | 2 +-
src/XGetCPtr.c | 2 +-
src/XGetDCtl.c | 2 +-
src/XGetFCtl.c | 2 +-
src/XGetKMap.c | 2 +-
src/XGetMMap.c | 2 +-
src/XGetProp.c | 2 +-
src/XGetVers.c | 28 +++++++++++-----------------
src/XIAllowEvents.c | 4 ++--
src/XIGrabDevice.c | 11 +++++++++--
src/XIHierarchy.c | 16 ++++++++++------
src/XIProperties.c | 3 ++-
src/XIQueryDevice.c | 3 ++-
src/XIQueryVersion.c | 8 ++++++--
src/XISelEv.c | 7 +++++--
src/XIint.h | 1 -
src/XListDProp.c | 2 +-
src/XOpenDev.c | 2 +-
src/XQueryDv.c | 2 +-
21 files changed, 59 insertions(+), 46 deletions(-)
New commits:
commit f180dff710dc54d00e0e26b84de053151f8f207e
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date: Thu Sep 10 01:16:19 2015 +1000
libXi 1.7.5
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/configure.ac b/configure.ac
index db70cef..9b40c4d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
# Initialize Autoconf
AC_PREREQ([2.60])
-AC_INIT([libXi], [1.7.4],
+AC_INIT([libXi], [1.7.5],
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXi])
AC_CONFIG_SRCDIR([Makefile.am])
AC_CONFIG_HEADERS([src/config.h])
commit 05c86e53c0bae30e58b32b94e191c8720990918a
Author: Cosimo Cecchi <cosimoc@gnome.org>
Date: Tue Feb 24 07:49:34 2015 +1000
Fix version check in _XIAllowEvents
Commit 5810d0797160a97012664ffe719a59e1b288a525 changed _XIAllowEvents() to
use _XiCheckVersion() instead of _XiCheckExtInit() to avoid a double display
unlock, but it failed to correctly check for the version, since we should set
have_XI22 to True for every version greater or equal to 2.2.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XIAllowEvents.c b/src/XIAllowEvents.c
index 52c17ab..e7be099 100644
--- a/src/XIAllowEvents.c
+++ b/src/XIAllowEvents.c
@@ -50,7 +50,7 @@ _XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time,
if (_XiCheckExtInit(dpy, XInput_2_0, extinfo) == -1)
return (NoSuchExtension);
- if (_XiCheckVersion(extinfo, XInput_2_2) == 0)
+ if (_XiCheckVersion(extinfo, XInput_2_2) >= 0)
have_XI22 = True;
if (have_XI22)
commit c648441036cf5ffc5225cd484e2c906d374f0a4b
Author: Michal Srb <msrb@suse.com>
Date: Mon Nov 3 12:43:40 2014 +0200
XIGrabDevice: Unlock display in error path.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XIGrabDevice.c b/src/XIGrabDevice.c
index a8c5697..22f4ea1 100644
--- a/src/XIGrabDevice.c
+++ b/src/XIGrabDevice.c
@@ -53,14 +53,20 @@ XIGrabDevice(Display* dpy, int deviceid, Window grab_window, Time time,
if (mask->mask_len > INT_MAX - 3 ||
(mask->mask_len + 3)/4 >= 0xffff)
- return BadValue;
+ {
+ reply.status = BadValue;
+ goto out;
+ }
/* mask->mask_len is in bytes, but we need 4-byte units on the wire,
* and they need to be padded with 0 */
len = (mask->mask_len + 3)/4;
buff = calloc(4, len);
if (!buff)
- return BadAlloc;
+ {
+ reply.status = BadAlloc;
+ goto out;
+ }
GetReq(XIGrabDevice, req);
req->reqType = extinfo->codes->major_opcode;
@@ -83,6 +89,7 @@ XIGrabDevice(Display* dpy, int deviceid, Window grab_window, Time time,
if (_XReply(dpy, (xReply *)&reply, 0, xTrue) == 0)
reply.status = GrabSuccess;
+out:
UnlockDisplay(dpy);
SyncHandle();
commit 29c77457ad86966ae2204b865fb8b437269063c4
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:57 2014 +0200
Refactor XGetExtensionVersion.
_XiGetExtensionVersion was called from XGetExtensionVersion and from
_XiCheckExtInit. When called from _XiCheckExtInit, nothing accounted for the
fact that it can return ((XExtensionVersion *) NoSuchExtension) in case of
error. Also it recursively calls _XiCheckExtInit potentionally causing multiple
unlocks if _XiCheckExtInit fails.
-> Remove it and call directly _XiGetExtensionVersionRequest and only call
_XiCheckExtInit only from XGetExtensionVersion.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XExtInt.c b/src/XExtInt.c
index d3c6b7c..672d69a 100644
--- a/src/XExtInt.c
+++ b/src/XExtInt.c
@@ -380,7 +380,7 @@ _XiCheckExtInit(
return (-1);
}
((XInputData *) info->data)->vers =
- _XiGetExtensionVersion(dpy, "XInputExtension", info);
+ _XiGetExtensionVersionRequest(dpy, "XInputExtension", info->codes->major_opcode);
}
if (_XiCheckVersion(info, version_index) < 0) {
diff --git a/src/XGetVers.c b/src/XGetVers.c
index 0751b98..f7e22e6 100644
--- a/src/XGetVers.c
+++ b/src/XGetVers.c
@@ -68,12 +68,16 @@ XGetExtensionVersion(register Display * dpy, _Xconst char *name)
XExtDisplayInfo *info = XInput_find_display(dpy);
LockDisplay(dpy);
- ext = _XiGetExtensionVersion(dpy, name, info);
- if (ext != (XExtensionVersion *) NoSuchExtension) {
- UnlockDisplay(dpy);
- SyncHandle();
- }
- return (ext);
+
+ if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
+ return NULL;
+
+ ext = _XiGetExtensionVersionRequest(dpy, name, info->codes->major_opcode);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ return ext;
}
_X_HIDDEN XExtensionVersion*
@@ -91,7 +95,7 @@ _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode)
_XSend(dpy, name, (long)req->nbytes);
if (!_XReply(dpy, (xReply *) & rep, 0, xTrue)) {
- return (XExtensionVersion *) NULL;
+ return NULL;
}
ext = (XExtensionVersion *) Xmalloc(sizeof(XExtensionVersion));
@@ -105,13 +109,3 @@ _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode)
return ext;
}
-
-_X_HIDDEN XExtensionVersion *
-_XiGetExtensionVersion(register Display * dpy, _Xconst char *name,
- XExtDisplayInfo *info)
-{
- if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
- return ((XExtensionVersion *) NoSuchExtension);
-
- return _XiGetExtensionVersionRequest(dpy, name, info->codes->major_opcode);
-}
diff --git a/src/XIint.h b/src/XIint.h
index 99f3652..9479a79 100644
--- a/src/XIint.h
+++ b/src/XIint.h
@@ -29,7 +29,6 @@ extern XExtDisplayInfo *XInput_find_display(Display *);
extern int _XiCheckExtInit(Display *, int, XExtDisplayInfo *);
extern int _XiCheckVersion(XExtDisplayInfo *info, int version_index);
-extern XExtensionVersion *_XiGetExtensionVersion(Display *, _Xconst char *, XExtDisplayInfo *);
extern XExtensionVersion* _XiGetExtensionVersionRequest(Display *dpy, _Xconst char *name, int xi_opcode);
extern Status _xiQueryVersion(Display *dpy, int*, int*, XExtDisplayInfo *);
commit 5810d0797160a97012664ffe719a59e1b288a525
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:56 2014 +0200
Fix logic in _XIAllowEvents and prevent double unlock.
Replacing the second _XiCheckExtInit with _XiCheckVersion prevents possible
double unlock as _XiCheckExtInit actually unlocks the display when it returns
-1.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XIAllowEvents.c b/src/XIAllowEvents.c
index 2468fce..52c17ab 100644
--- a/src/XIAllowEvents.c
+++ b/src/XIAllowEvents.c
@@ -40,7 +40,7 @@ static Status
_XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time,
unsigned int touchid, Window grab_window)
{
- Bool have_XI22 = True;
+ Bool have_XI22 = False;
xXIAllowEventsReq *req;
xXI2_2AllowEventsReq *req_XI22;
@@ -50,7 +50,7 @@ _XIAllowEvents(Display *dpy, int deviceid, int event_mode, Time time,
if (_XiCheckExtInit(dpy, XInput_2_0, extinfo) == -1)
return (NoSuchExtension);
- if (_XiCheckExtInit(dpy, XInput_2_2, extinfo) == 0)
+ if (_XiCheckVersion(extinfo, XInput_2_2) == 0)
have_XI22 = True;
if (have_XI22)
commit f699770e7c92da1dbf16892fde83438f0b79c979
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:54 2014 +0200
XIGetClientPointer: Return False on error.
Not NoSuchExtension which is 1 = True!
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XGetCPtr.c b/src/XGetCPtr.c
index a6a44b7..59a27d3 100644
--- a/src/XGetCPtr.c
+++ b/src/XGetCPtr.c
@@ -49,7 +49,7 @@ XIGetClientPointer(Display* dpy, Window win, int *deviceid)
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, Dont_Check, info) == -1)
- return (NoSuchExtension);
+ return False;
GetReq(XIGetClientPointer, req);
req->reqType = info->codes->major_opcode;
commit dc1f8c6ec1ba8135afa185c8e8360c1ed90bf96c
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:53 2014 +0200
Do not return NoSuchExtension casted to pointer as an error.
Several functions were returning NoSuchExtension casted to a pointer in case of
an error. Often in parallel with returning NULL in case of another error. It is
undocumented and certainly wrong.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XGMotion.c b/src/XGMotion.c
index a4c75b6..7785843 100644
--- a/src/XGMotion.c
+++ b/src/XGMotion.c
@@ -81,7 +81,7 @@ XGetDeviceMotionEvents(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XDeviceTimeCoord *) NoSuchExtension);
+ return NULL;
GetReq(GetDeviceMotionEvents, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XGetDCtl.c b/src/XGetDCtl.c
index b576aa5..c5d3b53 100644
--- a/src/XGetDCtl.c
+++ b/src/XGetDCtl.c
@@ -79,7 +79,7 @@ XGetDeviceControl(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Add_XChangeDeviceControl, info) == -1)
- return ((XDeviceControl *) NoSuchExtension);
+ return NULL;
GetReq(GetDeviceControl, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XGetFCtl.c b/src/XGetFCtl.c
index 2d71fab..7fd6d0e 100644
--- a/src/XGetFCtl.c
+++ b/src/XGetFCtl.c
@@ -79,7 +79,7 @@ XGetFeedbackControl(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XFeedbackState *) NoSuchExtension);
+ return NULL;
GetReq(GetFeedbackControl, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XGetKMap.c b/src/XGetKMap.c
index 00dde06..0540ce4 100644
--- a/src/XGetKMap.c
+++ b/src/XGetKMap.c
@@ -78,7 +78,7 @@ XGetDeviceKeyMapping(register Display * dpy, XDevice * dev,
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((KeySym *) NoSuchExtension);
+ return NULL;
GetReq(GetDeviceKeyMapping, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XGetMMap.c b/src/XGetMMap.c
index ce10c2d..246698c 100644
--- a/src/XGetMMap.c
+++ b/src/XGetMMap.c
@@ -73,7 +73,7 @@ XGetDeviceModifierMapping(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XModifierKeymap *) NoSuchExtension);
+ return NULL;
GetReq(GetDeviceModifierMapping, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XGetProp.c b/src/XGetProp.c
index 8c69ef2..a3fa558 100644
--- a/src/XGetProp.c
+++ b/src/XGetProp.c
@@ -75,7 +75,7 @@ XGetDeviceDontPropagateList(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XEventClass *) NoSuchExtension);
+ return NULL;
GetReq(GetDeviceDontPropagateList, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XOpenDev.c b/src/XOpenDev.c
index e784f8b..029dec2 100644
--- a/src/XOpenDev.c
+++ b/src/XOpenDev.c
@@ -73,7 +73,7 @@ XOpenDevice(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XDevice *) NoSuchExtension);
+ return NULL;
GetReq(OpenDevice, req);
req->reqType = info->codes->major_opcode;
diff --git a/src/XQueryDv.c b/src/XQueryDv.c
index 3836777..de1c0e5 100644
--- a/src/XQueryDv.c
+++ b/src/XQueryDv.c
@@ -78,7 +78,7 @@ XQueryDeviceState(
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- return ((XDeviceState *) NoSuchExtension);
+ return NULL;
GetReq(QueryDeviceState, req);
req->reqType = info->codes->major_opcode;
commit 83261c52a17543437882e2863b7f06a92c9039f8
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:52 2014 +0200
XIChangeHierarchy: Add missing unlock.
When num_changes <= 0 or Xmalloc fails, the display has to be unlocked.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XIHierarchy.c b/src/XIHierarchy.c
index 3d2b4f2..441fec0 100644
--- a/src/XIHierarchy.c
+++ b/src/XIHierarchy.c
@@ -49,14 +49,14 @@ XIChangeHierarchy(Display* dpy,
xXIChangeHierarchyReq *req;
XExtDisplayInfo *info = XInput_find_display(dpy);
char *data = NULL, *dptr;
- int dlen = 0, i;
+ int dlen = 0, i, ret = Success;
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_2_0, info) == -1)
return (NoSuchExtension);
if (num_changes <= 0)
- return Success;
+ goto out;
GetReq(XIChangeHierarchy, req);
req->reqType = info->codes->major_opcode;
@@ -91,8 +91,10 @@ XIChangeHierarchy(Display* dpy,
req->length += dlen / 4; /* dlen is 4-byte aligned */
data = Xmalloc(dlen);
- if (!data)
- return BadAlloc;
+ if (!data) {
+ ret = BadAlloc;
+ goto out;
+ }
dptr = data;
for (i = 0, any = changes; i < num_changes; i++, any++)
@@ -155,8 +157,10 @@ XIChangeHierarchy(Display* dpy,
}
Data(dpy, data, dlen);
+
+out:
Xfree(data);
UnlockDisplay(dpy);
SyncHandle();
- return Success;
+ return ret;
}
commit 22ae8d4f26e92b17e1ce8239a38481933d6f1ca7
Author: Michal Srb <msrb@suse.com>
Date: Sat Nov 1 20:00:51 2014 +0200
Fix double unlock when _XiCheckExtInit return -1.
_XiCheckExtInit unlocks the display if it fails and returns -1. Most callers
account for it properly, but few didn't.
Signed-off-by: Michal Srb <msrb@suse.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
diff --git a/src/XIProperties.c b/src/XIProperties.c
index 32436d1..a16e182 100644
--- a/src/XIProperties.c
+++ b/src/XIProperties.c
@@ -51,7 +51,7 @@ XIListProperties(Display* dpy, int deviceid, int *num_props_return)
LockDisplay(dpy);
*num_props_return = 0;
if (_XiCheckExtInit(dpy, XInput_2_0, info) == -1)
- goto cleanup;
+ goto cleanup_unlocked;
GetReq(XIListProperties, req);
req->reqType = info->codes->major_opcode;
@@ -76,6 +76,7 @@ XIListProperties(Display* dpy, int deviceid, int *num_props_return)
cleanup:
UnlockDisplay(dpy);
+cleanup_unlocked:
SyncHandle();
return props;
}
diff --git a/src/XIQueryDevice.c b/src/XIQueryDevice.c
index 4be1eca..fb8504f 100644
--- a/src/XIQueryDevice.c
+++ b/src/XIQueryDevice.c
@@ -50,7 +50,7 @@ XIQueryDevice(Display *dpy, int deviceid, int *ndevices_return)
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_2_0, extinfo) == -1)
- goto error;
+ goto error_unlocked;
GetReq(XIQueryDevice, req);
req->reqType = extinfo->codes->major_opcode;
@@ -105,6 +105,7 @@ XIQueryDevice(Display *dpy, int deviceid, int *ndevices_return)
error:
UnlockDisplay(dpy);
+error_unlocked:
SyncHandle();
*ndevices_return = -1;
return NULL;
diff --git a/src/XIQueryVersion.c b/src/XIQueryVersion.c
index 3f2e73e..57bd079 100644
--- a/src/XIQueryVersion.c
+++ b/src/XIQueryVersion.c
@@ -41,10 +41,8 @@ XIQueryVersion(Display *dpy, int *major_inout, int *minor_inout)
XExtDisplayInfo *info = XInput_find_display(dpy);
- LockDisplay(dpy);
rc = _xiQueryVersion(dpy, major_inout, minor_inout, info);
- UnlockDisplay(dpy);
SyncHandle();
return rc;
}
@@ -55,6 +53,8 @@ _xiQueryVersion(Display * dpy, int *major, int *minor, XExtDisplayInfo *info)
xXIQueryVersionReq *req;
xXIQueryVersionReply rep;
+ LockDisplay(dpy);
+
/* This could mean either a malloc problem, or supported
version < XInput_2_0 */
if (_XiCheckExtInit(dpy, XInput_2_0, info) == -1)
@@ -82,9 +82,13 @@ _xiQueryVersion(Display * dpy, int *major, int *minor, XExtDisplayInfo *info)
req->minor_version = *minor;
if (!_XReply(dpy, (xReply*)&rep, 0, xTrue)) {
+ UnlockDisplay(dpy);
return BadImplementation;
}
+
*major = rep.major_version;
*minor = rep.minor_version;
+
+ UnlockDisplay(dpy);
return Success;
}
diff --git a/src/XISelEv.c b/src/XISelEv.c
index 55c0a6a..aeee1e3 100644
--- a/src/XISelEv.c
+++ b/src/XISelEv.c
@@ -60,7 +60,7 @@ XISelectEvents(Display* dpy, Window win, XIEventMask* masks, int num_masks)
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_2_0, info) == -1) {
r = NoSuchExtension;
- goto out;
+ goto out_unlocked;
}
for (i = 0; i < num_masks; i++) {
@@ -114,6 +114,7 @@ XISelectEvents(Display* dpy, Window win, XIEventMask* masks, int num_masks)
free(buff);
out:
UnlockDisplay(dpy);
+out_unlocked:
SyncHandle();
return r;
@@ -134,7 +135,7 @@ XIGetSelectedEvents(Display* dpy, Window win, int *num_masks_return)
*num_masks_return = -1;
LockDisplay(dpy);
if (_XiCheckExtInit(dpy, XInput_2_0, info) == -1)
- goto out;
+ goto out_unlocked;
GetReq(XIGetSelectedEvents, req);
@@ -209,6 +210,8 @@ out:
Xfree(mask_in);
UnlockDisplay(dpy);
+
+out_unlocked:
SyncHandle();
return mask_out;
diff --git a/src/XListDProp.c b/src/XListDProp.c
index bde6cb5..55f3c51 100644
--- a/src/XListDProp.c
+++ b/src/XListDProp.c
@@ -51,7 +51,7 @@ XListDeviceProperties(Display* dpy, XDevice* dev, int *nprops_return)
LockDisplay(dpy);
*nprops_return = 0;
if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1)
- goto cleanup;
+ return NULL;
GetReq(ListDeviceProperties, req);
req->reqType = info->codes->major_opcode;
commit 71a42145b678be623e30bd5bf55833a04f14376f
Author: Julien Cristau <jcristau@debian.org>
Date: Mon Oct 27 19:00:36 2014 +0100
Advance the request buffer by the right amount in XIChangeHierarchy
c->length is in 4-byte units, dptr is a char *, so we need to advance
dptr by 4 * length to get the position of the next HierarchyChangeInfo.
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Julien Cristau <jcristau@debian.org>
diff --git a/src/XIHierarchy.c b/src/XIHierarchy.c
index 39c3d1b..3d2b4f2 100644
--- a/src/XIHierarchy.c
+++ b/src/XIHierarchy.c
@@ -109,7 +109,7 @@ XIChangeHierarchy(Display* dpy,
c->name_len = strlen(C->name);
c->length = (sizeof(xXIAddMasterInfo) + c->name_len + 3)/4;
strncpy((char*)&c[1], C->name, c->name_len);
- dptr += c->length;
+ dptr += 4 * c->length;
}
break;
case XIRemoveMaster:
Reply to: