Date: Thursday, October 13, 2016 @ 16:37:13 Author: lcarlier Revision: 278796
upgpkg: libxi 1.7.7-2 fix FS#51298 Added: libxi/trunk/fix-gtk2-segfault.patch Modified: libxi/trunk/PKGBUILD -------------------------+ PKGBUILD | 14 ++ fix-gtk2-segfault.patch | 241 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 252 insertions(+), 3 deletions(-) Modified: PKGBUILD =================================================================== --- PKGBUILD 2016-10-13 16:28:37 UTC (rev 278795) +++ PKGBUILD 2016-10-13 16:37:13 UTC (rev 278796) @@ -4,7 +4,7 @@ pkgname=libxi pkgver=1.7.7 -pkgrel=1 +pkgrel=2 pkgdesc="X11 Input extension library" arch=('i686' 'x86_64') url="http://xorg.freedesktop.org" @@ -11,12 +11,20 @@ depends=('libxext' 'inputproto') makedepends=('pkgconfig' 'xorg-util-macros' 'libxfixes' 'automake') license=('custom') -source=(${url}/releases/individual/lib/libXi-${pkgver}.tar.bz2{,.sig}) +source=(${url}/releases/individual/lib/libXi-${pkgver}.tar.bz2{,.sig} + fix-gtk2-segfault.patch) sha256sums=('996f834fa57b9b33ba36690f6f5c6a29320bc8213022943912462d8015b1e030' - 'SKIP') + 'SKIP' + '34ac1854b6bb14cbb048ddbd20cce7a4b2ad1e8ffa6b116aa20b0dfc56655c4b') validpgpkeys=('3C2C43D9447D5938EF4551EBE23B7E70B467F0BF') # Peter Hutterer validpgpkeys+=('C41C985FDCF1E5364576638B687393EE37D128F8') # Matthieu Herrb <matthieu.he...@laas.fr> +prepare() { + cd libXi-${pkgver} + #fix FS#51298 + patch -Np1 -i ../fix-gtk2-segfault.patch +} + build() { cd libXi-${pkgver} ./configure --prefix=/usr --sysconfdir=/etc --disable-static Added: fix-gtk2-segfault.patch =================================================================== --- fix-gtk2-segfault.patch (rev 0) +++ fix-gtk2-segfault.patch 2016-10-13 16:37:13 UTC (rev 278796) @@ -0,0 +1,241 @@ +From patchwork Thu Oct 13 03:58:22 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v2,libXi,1/2] SizeClassInfo can return 0 even without an error +From: Peter Hutterer <peter.hutte...@who-t.net> +X-Patchwork-Id: 115413 +Message-Id: <1476331103-24072-1-git-send-email-peter.hutte...@who-t.net> +To: xorg-de...@lists.freedesktop.org +Cc: Niels Ole Salscheider <niels_...@salscheider-online.de> +Date: Thu, 13 Oct 2016 13:58:22 +1000 + +From: Niels Ole Salscheider <niels_...@salscheider-online.de> + +Catch the error case separately. Commit 19a9cd607d added length checking to +SizeClassInfo but re-used the return value of 0 for an error. A device without +classes (as is initialized by xf86-input-libinput for tablets) can +legitimately return 0 and erroneously triggers an error. +Fix this by using a separate value for the error. + +Reproducible by calling XListInputDevices() with a tablet attached. + +This fixes a regression introduced in commit 19a9cd607d. + +Signed-off-by: Niels Ole Salscheider <niels_...@salscheider-online.de> +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +--- +Changes to v1: +- don't touch *size until we're sure. +- expand commit message + +Niels: +I left you as author and your signed-off-by since it's essentially your +patch with a minor change. + + src/XListDev.c | 24 +++++++++++++----------- + 1 file changed, 13 insertions(+), 11 deletions(-) + +diff --git a/src/XListDev.c b/src/XListDev.c +index f850cd0..e4bd3d5 100644 +--- a/src/XListDev.c ++++ b/src/XListDev.c +@@ -73,27 +73,28 @@ static int pad_to_xid(int base_size) + return ((base_size + padsize - 1)/padsize) * padsize; + } + +-static size_t +-SizeClassInfo(xAnyClassPtr *any, size_t len, int num_classes) ++static int ++SizeClassInfo(xAnyClassPtr *any, size_t len, int num_classes, size_t *size) + { +- int size = 0; + int j; ++ size_t sz = 0; ++ + for (j = 0; j < num_classes; j++) { + switch ((*any)->class) { + case KeyClass: +- size += pad_to_xid(sizeof(XKeyInfo)); ++ sz += pad_to_xid(sizeof(XKeyInfo)); + break; + case ButtonClass: +- size += pad_to_xid(sizeof(XButtonInfo)); ++ sz += pad_to_xid(sizeof(XButtonInfo)); + break; + case ValuatorClass: + { + xValuatorInfoPtr v; + + if (len < sizeof(v)) +- return 0; ++ return 1; + v = (xValuatorInfoPtr) *any; +- size += pad_to_xid(sizeof(XValuatorInfo) + ++ sz += pad_to_xid(sizeof(XValuatorInfo) + + (v->num_axes * sizeof(XAxisInfo))); + break; + } +@@ -101,11 +102,13 @@ SizeClassInfo(xAnyClassPtr *any, size_t len, int num_classes) + break; + } + if ((*any)->length > len) +- return 0; ++ return 1; + *any = (xAnyClassPtr) ((char *)(*any) + (*any)->length); + } + +- return size; ++ *size = sz; ++ ++ return 0; + } + + static void +@@ -220,8 +223,7 @@ XListInputDevices( + sav_any = any; + end = (char *)list + rlen; + for (i = 0; i < *ndevices; i++, list++) { +- s = SizeClassInfo(&any, end - (char *)any, (int)list->num_classes); +- if (!s) ++ if(SizeClassInfo(&any, end - (char *)any, (int)list->num_classes, &s)) + goto out; + size += s; + } + +From patchwork Thu Oct 13 03:58:23 2016 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +Subject: [v2, libXi, + 2/2] XListInputDevices: don't touch ndevices in case of error +From: Peter Hutterer <peter.hutte...@who-t.net> +X-Patchwork-Id: 115414 +Message-Id: <1476331103-24072-2-git-send-email-peter.hutte...@who-t.net> +To: xorg-de...@lists.freedesktop.org +Cc: Niels Ole Salscheider <niels_...@salscheider-online.de> +Date: Thu, 13 Oct 2016 13:58:23 +1000 + +We used to always set *ndevices to the number of devices returned by the +server. This magically worked because we pretty much never returned an error +except on faulty server or library implementations. With 19a9cd60 we now have +more chances of getting an error, so the polite thing is to just leave *ndevices +alone when we error out. + +Document it as such in the man page, just in case someone accidentally reads +it. + +Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> +CC: Niels Ole Salscheider <niels_...@salscheider-online.de> +--- +Changes to v1: +- Niels' first patch set ndevices to 0, this one leaves it untouched + + man/XListInputDevices.txt | 12 ++++++++++-- + src/XListDev.c | 21 ++++++++++++--------- + 2 files changed, 22 insertions(+), 11 deletions(-) + +diff --git a/man/XListInputDevices.txt b/man/XListInputDevices.txt +index 276660d..450f377 100644 +--- a/man/XListInputDevices.txt ++++ b/man/XListInputDevices.txt +@@ -220,5 +220,13 @@ DESCRIPTION + Floating. If the device is a master device, attached specifies + the device ID of the master device this device is paired with. + +- To free the XDeviceInfo array created by XListInputDevices, use +- XFreeDeviceList. ++RETURN VALUE ++------------ ++ ++ XListInputDevices returns a pointer to an array of XDeviceInfo ++ structs and sets ndevices_return to the number of elements in ++ that array. To free the XDeviceInfo array created by ++ XListInputDevices, use XFreeDeviceList. ++ ++ On error, XListInputDevices returns NULL and ndevices_return is ++ left unmodified. +diff --git a/src/XListDev.c b/src/XListDev.c +index e4bd3d5..dda6011 100644 +--- a/src/XListDev.c ++++ b/src/XListDev.c +@@ -175,7 +175,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyClassPtr *Any, int num_classes) + XDeviceInfo * + XListInputDevices( + register Display *dpy, +- int *ndevices) ++ int *ndevices_return) + { + size_t s, size; + xListInputDevicesReq *req; +@@ -190,6 +190,7 @@ XListInputDevices( + int i; + unsigned long rlen; + XExtDisplayInfo *info = XInput_find_display(dpy); ++ int ndevices; + + LockDisplay(dpy); + if (_XiCheckExtInit(dpy, XInput_Initial_Release, info) == -1) +@@ -205,8 +206,8 @@ XListInputDevices( + return (XDeviceInfo *) NULL; + } + +- if ((*ndevices = rep.ndevices)) { /* at least 1 input device */ +- size = *ndevices * sizeof(XDeviceInfo); ++ if ((ndevices = rep.ndevices)) { /* at least 1 input device */ ++ size = ndevices * sizeof(XDeviceInfo); + if (rep.length < (INT_MAX >> 2)) { + rlen = rep.length << 2; /* multiply length by 4 */ + slist = list = Xmalloc(rlen); +@@ -219,17 +220,17 @@ XListInputDevices( + } + _XRead(dpy, (char *)list, rlen); + +- any = (xAnyClassPtr) ((char *)list + (*ndevices * sizeof(xDeviceInfo))); ++ any = (xAnyClassPtr) ((char *)list + (ndevices * sizeof(xDeviceInfo))); + sav_any = any; + end = (char *)list + rlen; +- for (i = 0; i < *ndevices; i++, list++) { ++ for (i = 0; i < ndevices; i++, list++) { + if(SizeClassInfo(&any, end - (char *)any, (int)list->num_classes, &s)) + goto out; + size += s; + } + + Nptr = ((unsigned char *)list) + rlen; +- for (i = 0, nptr = (unsigned char *)any; i < *ndevices; i++) { ++ for (i = 0, nptr = (unsigned char *)any; i < ndevices; i++) { + if (nptr >= Nptr) + goto out; + size += *nptr + 1; +@@ -245,10 +246,10 @@ XListInputDevices( + } + sclist = clist; + Any = (XAnyClassPtr) ((char *)clist + +- (*ndevices * sizeof(XDeviceInfo))); ++ (ndevices * sizeof(XDeviceInfo))); + list = slist; + any = sav_any; +- for (i = 0; i < *ndevices; i++, list++, clist++) { ++ for (i = 0; i < ndevices; i++, list++, clist++) { + clist->type = list->type; + clist->id = list->id; + clist->use = list->use; +@@ -261,7 +262,7 @@ XListInputDevices( + clist = sclist; + nptr = (unsigned char *)any; + Nptr = (unsigned char *)Any; +- for (i = 0; i < *ndevices; i++, clist++) { ++ for (i = 0; i < ndevices; i++, clist++) { + clist->name = (char *)Nptr; + memcpy(Nptr, nptr + 1, *nptr); + Nptr += (*nptr); +@@ -270,6 +271,8 @@ XListInputDevices( + } + } + ++ *ndevices_return = ndevices; ++ + out: + XFree((char *)slist); + UnlockDisplay(dpy);