Add patch to fix crash triggered by gtk+-3, bug #390693.
authorChí-Thanh Christopher Nguyễn <chithanh@gentoo.org>
Wed, 16 Nov 2011 21:13:07 +0000 (21:13 +0000)
committerChí-Thanh Christopher Nguyễn <chithanh@gentoo.org>
Wed, 16 Nov 2011 21:13:07 +0000 (21:13 +0000)
Package-Manager: portage-2.2.0_alpha72/cvs/Linux x86_64

x11-libs/libXi/ChangeLog
x11-libs/libXi/Manifest
x11-libs/libXi/files/libXi-1.4.3-xiquerydevice.patch [new file with mode: 0644]
x11-libs/libXi/libXi-1.4.3-r1.ebuild [new file with mode: 0644]

index f7501cb19429cf2e79bd4e5dfb769ef29b9d3032..a72522ee8706fc2db230806e7cd1c91ea459a86d 100644 (file)
@@ -1,6 +1,12 @@
 # ChangeLog for x11-libs/libXi
 # Copyright 1999-2011 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/x11-libs/libXi/ChangeLog,v 1.124 2011/08/20 15:54:16 jer Exp $
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/libXi/ChangeLog,v 1.125 2011/11/16 21:13:07 chithanh Exp $
+
+*libXi-1.4.3-r1 (16 Nov 2011)
+
+  16 Nov 2011; Chí-Thanh Christopher Nguyễn <chithanh@gentoo.org>
+  +libXi-1.4.3-r1.ebuild, +files/libXi-1.4.3-xiquerydevice.patch:
+  Add patch to fix crash triggered by gtk+-3, bug #390693.
 
   20 Aug 2011; Jeroen Roovers <jer@gentoo.org> libXi-1.4.2.ebuild,
   libXi-1.4.3.ebuild:
index f994a789d230ef213099d94666b63b63d861dd52..ecf335c966ea4f13f08c1eaee49cf37c48cf6825 100644 (file)
@@ -1,18 +1,10 @@
------BEGIN PGP SIGNED MESSAGE-----
-Hash: SHA1
-
+AUX libXi-1.4.3-xiquerydevice.patch 6562 RMD160 186146896f9089c478dd019d62d0375d8d8d9ae0 SHA1 18bc7b26365ef33079ec4ebbb8afdf2a6df9ef6d SHA256 693185a06fbc4839811a3ff529526dcccd58f06f28d0b594cc649b620bd39fd5
 DIST libXi-1.4.1.tar.bz2 407880 RMD160 7447cc3ef411d833bee36fca6f6ffb13108ce113 SHA1 15c9d369cc76c73b5e3833ba3b39355e6cc06636 SHA256 599f1c0930f94c2ae74711b2577a7f354c4a991cc97b5ec5bb655b855c1429a6
 DIST libXi-1.4.2.tar.bz2 398801 RMD160 2753987b72a91683321bc02172901f1d5c5b5664 SHA1 97e60a60dd789287e47df807e487f4952dd4ff95 SHA256 272b8041efc0a0203fb0ba33481ddec989539aed862181b58c8c3e410e325691
 DIST libXi-1.4.3.tar.bz2 422637 RMD160 142d44e8e13abbb8a41826b7005f8ede1807e3ff SHA1 c66cfdee74e8d169a7992b5f257395e653ca761b SHA256 08c9d89a404740592621e6f5078414df86ccc78ca876e3da1af15639d81c74e0
 EBUILD libXi-1.4.1.ebuild 1031 RMD160 05a4d8a281b6e5055146dc44be1f0eef617bc3c3 SHA1 6ad3702abba81fdc3bae3311bc96d1b9728ccc20 SHA256 e5c7387867325dd5eac0e78402f3ca20ec22b198144f73789438ce7601b287e1
 EBUILD libXi-1.4.2.ebuild 985 RMD160 fb4b3ddc60ef4730604df94e0790b21f5efb373c SHA1 4f7698fe2279ad7462f41b50527ec7a253ef0501 SHA256 bf0876bbfeadeef11c5c7229be84a3d64634db9c4a7238966faa120615d1cf30
+EBUILD libXi-1.4.3-r1.ebuild 1074 RMD160 c6633959357bd2748a95951195c1d79a9d0c1894 SHA1 e8b7cfa39e23b330ec0381b77358549c96607abb SHA256 7e831b84aa2400727ecdfa8c71986ee29439908fb35a8322c6353fc2fbaff003
 EBUILD libXi-1.4.3.ebuild 995 RMD160 257c7ef268c911c8f53f9457ec29a80b844e42a1 SHA1 5c60c84422806c552ede0227d58846ac6addd330 SHA256 9a2bdce3f45e58f44d22925704a5d7fea0cf1bd4315c9f194064ca8f365f0ab7
-MISC ChangeLog 14713 RMD160 01f2bee8db393a0f48281658599eadf25fe9ba9b SHA1 2a3b00938e4249a34667280b06157535682f8847 SHA256 971e1672fc18f0e4f8c89da4a6d8409556be5d012533f87b683d6eb73c074eab
+MISC ChangeLog 14944 RMD160 89403563cb23fd0263b3604a78b71baf01667c6d SHA1 26e4a955b87aa4eaa447abdf852f8a3177602964 SHA256 4a647b09c943c55d03df116607ed2b0f063aaf14b35c464a66d798f82415deae
 MISC metadata.xml 156 RMD160 c1274bdccf57603d580de0075ba07a35b7509560 SHA1 6f78f604e3d079d39189b40aaaa1ddb06182ad91 SHA256 5101ab0d4cc8c7125eea733c44e86962769bd77acaf53b69223b9cadcdd29055
------BEGIN PGP SIGNATURE-----
-Version: GnuPG v2.0.17 (GNU/Linux)
-
-iEYEARECAAYFAk5P2K4ACgkQVWmRsqeSphO/qwCfeoLT4keGU4KHSuikPlqU6qJm
-8EAAn0EIFqmNRjR0H0KNP6eRxjpb/eXC
-=KiHr
------END PGP SIGNATURE-----
diff --git a/x11-libs/libXi/files/libXi-1.4.3-xiquerydevice.patch b/x11-libs/libXi/files/libXi-1.4.3-xiquerydevice.patch
new file mode 100644 (file)
index 0000000..8d8e3d3
--- /dev/null
@@ -0,0 +1,171 @@
+From 635c2c029b1e73311c3f650bcaf7eeb9e782134b Mon Sep 17 00:00:00 2001
+From: Peter Hutterer <peter.hutterer@who-t.net>
+Date: Wed, 17 Aug 2011 05:20:48 +0000
+Subject: Handle unknown device classes.
+
+If the server sends an unknown device class in response to an XIQueryDevice
+call, no memory is allocated for these classes but we still write type
+and sourceid as well as setting to->classes[i]. The latter causes multiple
+classes to point to the same memory field.
+
+Move the common code of assigning these three into the respective class type
+handlers so to automatically skip any unknown classes.
+
+Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
+---
+diff --git a/src/XExtInt.c b/src/XExtInt.c
+index 86a780e..9e1ad19 100644
+--- a/src/XExtInt.c
++++ b/src/XExtInt.c
+@@ -98,7 +98,7 @@ extern int _XiGetDevicePresenceNotifyEvent(
+     Display *         /* dpy */
+ );
+ 
+-int copy_classes(XIDeviceInfo *to, xXIAnyInfo* from, int nclasses);
++int copy_classes(XIDeviceInfo *to, xXIAnyInfo* from, int *nclasses);
+ int size_classes(xXIAnyInfo* from, int nclasses);
+ 
+ static XExtensionInfo *xinput_info;
+@@ -1448,30 +1448,29 @@ size_classes(xXIAnyInfo* from, int nclasses)
+  *             |______________________^
+  */
+ _X_HIDDEN int
+-copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
++copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses)
+ {
+     XIAnyClassInfo *any_lib;
+     xXIAnyInfo *any_wire;
+     void *ptr_lib;
+     char *ptr_wire;
+     int i, len;
++    int cls_idx = 0;
+ 
+     if (!to->classes)
+         return -1;
+ 
+     ptr_wire = (char*)from;
+     ptr_lib = to->classes;
+-    to->classes = next_block(&ptr_lib, nclasses * sizeof(XIAnyClassInfo*));
++    to->classes = next_block(&ptr_lib, *nclasses * sizeof(XIAnyClassInfo*));
++    memset(to->classes, 0, sizeof(*nclasses * sizeof(XIAnyClassInfo*)));
+     len = 0; /* count wire length */
+ 
+-    for (i = 0; i < nclasses; i++)
++    for (i = 0; i < *nclasses; i++)
+     {
+         any_lib = (XIAnyClassInfo*)ptr_lib;
+         any_wire = (xXIAnyInfo*)ptr_wire;
+ 
+-        to->classes[i] = any_lib;
+-        any_lib->type = any_wire->type;
+-        any_lib->sourceid = any_wire->sourceid;
+         switch(any_wire->type)
+         {
+             case XIButtonClass:
+@@ -1485,6 +1484,8 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+                     cls_lib = next_block(&ptr_lib, sizeof(XIButtonClassInfo));
+                     cls_wire = (xXIButtonInfo*)any_wire;
+ 
++                    cls_lib->type = cls_wire->type;
++                    cls_lib->sourceid = cls_wire->sourceid;
+                     cls_lib->num_buttons = cls_wire->num_buttons;
+                     size = ((((cls_wire->num_buttons + 7)/8) + 3)/4);
+                     cls_lib->state.mask_len = size * 4;
+@@ -1499,6 +1500,7 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+                     for (j = 0; j < cls_lib->num_buttons; j++)
+                         cls_lib->labels[j] = *atoms++;
+ 
++                    to->classes[cls_idx++] = any_lib;
+                     break;
+                 }
+             case XIKeyClass:
+@@ -1509,12 +1511,15 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+                     cls_lib = next_block(&ptr_lib, sizeof(XIKeyClassInfo));
+                     cls_wire = (xXIKeyInfo*)any_wire;
+ 
++                    cls_lib->type = cls_wire->type;
++                    cls_lib->sourceid = cls_wire->sourceid;
+                     cls_lib->num_keycodes = cls_wire->num_keycodes;
+                     cls_lib->keycodes = next_block(&ptr_lib,
+                             cls_lib->num_keycodes * sizeof(int));
+                     memcpy(cls_lib->keycodes, &cls_wire[1],
+                             cls_lib->num_keycodes);
+ 
++                    to->classes[cls_idx++] = any_lib;
+                     break;
+                 }
+             case XIValuatorClass:
+@@ -1525,6 +1530,8 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+                     cls_lib = next_block(&ptr_lib, sizeof(XIValuatorClassInfo));
+                     cls_wire = (xXIValuatorInfo*)any_wire;
+ 
++                    cls_lib->type = cls_wire->type;
++                    cls_lib->sourceid = cls_wire->sourceid;
+                     cls_lib->number = cls_wire->number;
+                     cls_lib->label  = cls_wire->label;
+                     cls_lib->resolution = cls_wire->resolution;
+@@ -1534,12 +1541,16 @@ copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses)
+                     /* FIXME: fractional parts */
+                     cls_lib->mode       = cls_wire->mode;
+ 
++                    to->classes[cls_idx++] = any_lib;
+                 }
+                 break;
+         }
+         len += any_wire->length * 4;
+         ptr_wire += any_wire->length * 4;
+     }
++
++    /* we may have skipped unknown classes, reset nclasses */
++    *nclasses = cls_idx;
+     return len;
+ }
+ 
+@@ -1550,6 +1561,7 @@ wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie)
+     XIDeviceChangedEvent *out;
+     XIDeviceInfo info;
+     int len;
++    int nclasses = in->num_classes;
+ 
+     len = size_classes((xXIAnyInfo*)&in[1], in->num_classes);
+ 
+@@ -1564,13 +1576,13 @@ wireToDeviceChangedEvent(xXIDeviceChangedEvent *in, XGenericEventCookie *cookie)
+     out->deviceid = in->deviceid;
+     out->sourceid = in->sourceid;
+     out->reason = in->reason;
+-    out->num_classes = in->num_classes;
+ 
+     out->classes = (XIAnyClassInfo**)&out[1];
+ 
+     info.classes = out->classes;
+ 
+-    copy_classes(&info, (xXIAnyInfo*)&in[1], in->num_classes);
++    copy_classes(&info, (xXIAnyInfo*)&in[1], &nclasses);
++    out->num_classes = nclasses;
+ 
+     return 1;
+ }
+diff --git a/src/XIQueryDevice.c b/src/XIQueryDevice.c
+index 4e2f392..c22aee1 100644
+--- a/src/XIQueryDevice.c
++++ b/src/XIQueryDevice.c
+@@ -29,7 +29,7 @@
+ #include <X11/extensions/extutil.h>
+ #include "XIint.h"
+ 
+-extern int copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int nclasses);
++extern int copy_classes(XIDeviceInfo* to, xXIAnyInfo* from, int *nclasses);
+ extern int size_classes(xXIAnyInfo* from, int nclasses);
+ 
+ XIDeviceInfo*
+@@ -87,7 +87,7 @@ XIQueryDevice(Display *dpy, int deviceid, int *ndevices_return)
+         ptr += ((wire->name_len + 3)/4) * 4;
+ 
+         lib->classes = Xmalloc(size_classes((xXIAnyInfo*)ptr, lib->num_classes));
+-        ptr += copy_classes(lib, (xXIAnyInfo*)ptr, lib->num_classes);
++        ptr += copy_classes(lib, (xXIAnyInfo*)ptr, &lib->num_classes);
+     }
+ 
+     Xfree(buf);
+--
+cgit v0.9.0.2-2-gbebe
diff --git a/x11-libs/libXi/libXi-1.4.3-r1.ebuild b/x11-libs/libXi/libXi-1.4.3-r1.ebuild
new file mode 100644 (file)
index 0000000..7977572
--- /dev/null
@@ -0,0 +1,40 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/libXi/libXi-1.4.3-r1.ebuild,v 1.1 2011/11/16 21:13:07 chithanh Exp $
+
+EAPI=4
+
+XORG_DOC=doc
+inherit xorg-2
+
+DESCRIPTION="X.Org Xi library"
+KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-fbsd ~x64-freebsd ~x86-freebsd ~x86-interix ~amd64-linux ~x86-linux ~ppc-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris ~x86-winnt"
+IUSE=""
+
+RDEPEND=">=x11-libs/libX11-1.3
+       >=x11-libs/libXext-1.1
+       >=x11-proto/inputproto-2.0
+       >=x11-proto/xproto-7.0.13
+       >=x11-proto/xextproto-7.0.3"
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+       "${FILESDIR}/${PN}-1.4.3-xiquerydevice.patch"
+)
+
+pkg_setup() {
+       xorg-2_pkg_setup
+       XORG_CONFIGURE_OPTIONS=(
+               $(use_enable doc specs)
+               $(use_with doc xmlto)
+               $(use_with doc asciidoc)
+               --without-fop
+       )
+}
+
+pkg_postinst() {
+       xorg-2_pkg_postinst
+
+       ewarn "Some special keys and keyboard layouts may stop working."
+       ewarn "To fix them, recompile xorg-server."
+}