On Fri, Jan 13, 2012 at 03:03:09PM +0100, David Coppa wrote:
> Hi!
>
> I've noticed that on sparc64 we got the same SIGBUS described here:
>
> http://comments.gmane.org/gmane.comp.freedesktop.xorg/44722
>
> This happens frequently and it's annoying as it renders GTK2
> applications unusable on sparc64, since our gtk+2 is being
> built using "--with-xinput".
>
> ---8<---
>
> GNU gdb 6.3
> Copyright 2004 Free Software Foundation, Inc.
> GDB is free software, covered by the GNU General Public License, and you are
> welcome to change it and/or distribute copies of it under certain conditions.
> Type "show copying" to see the conditions.
> There is absolutely no warranty for GDB. Type "show warranty" for details.
> This GDB was configured as "sparc64-unknown-openbsd5.0"...(no debugging
> symbols found)
>
> (gdb) run
> Starting program: /usr/local/bin/gtk-demo
> (no debugging symbols found)
> (no debugging symbols found)
> (no debugging symbols found)
>
> Program received signal SIGBUS, Bus error.
> 0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068,
> Any=0xfffffffffffcf058, num_classes=1) at
> /usr/xenocara/lib/libXi/src/XListDev.c:104
> 104 K->class = KeyClass;
> (gdb) bt
> #0 0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068,
> Any=0xfffffffffffcf058, num_classes=1) at
> /usr/xenocara/lib/libXi/src/XListDev.c:104
> #1 0x000000020bd63024 in XListInputDevices (dpy=0x20ca5edb0,
> ndevices=0xfffffffffffcf18c) at /usr/xenocara/lib/libXi/src/XListDev.c:227
> #2 0x0000000209b7c518 in gdk_drag_action_get_type () from
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #3 0x0000000209b53c74 in gdk_drag_action_get_type () from
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #4 0x0000000209b1c58c in gdk_display_open_default_libgtk_only () from
> /usr/local/lib/libgdk-x11-2.0.so.2400.0
> #5 0x00000002008603e4 in gtk_init_check () from
> /usr/local/lib/libgtk-x11-2.0.so.2400.0
> #6 0x000000020086041c in gtk_init () from
> /usr/local/lib/libgtk-x11-2.0.so.2400.0
> #7 0x0000000000122e5c in main ()
> (gdb) bt full
> #0 0x000000020bd628ac in ParseClassInfo (any=0xfffffffffffcf068,
> Any=0xfffffffffffcf058, num_classes=1) at
> /usr/xenocara/lib/libXi/src/XListDev.c:104
> K = 0x20785ad44
> k = 0x20c994860
> j = 0
> k = 3
> #1 0x000000020bd63024 in XListInputDevices (dpy=0x20ca5edb0,
> ndevices=0xfffffffffffcf18c) at /usr/xenocara/lib/libXi/src/XListDev.c:227
> size = 695
> req = (xListInputDevicesReq *) 0x202248000
> rep = {repType = 1 '\001', RepType = 2 '\002', sequenceNumber = 105,
> length = 87, ndevices = 6 '\006', pad1 = 0 '\0', pad2 = 0 '\0', pad3 = 0
> '\0',
> pad01 = 0, pad02 = 0, pad03 = 0, pad04 = 0, pad05 = 0}
> list = (xDeviceInfo *) 0x20c994808
> slist = (xDeviceInfo *) 0x20c994800
> sclist = (XDeviceInfo *) 0x20785ac00
> clist = (XDeviceInfo *) 0x20785ac28
> any = 0x20c994860
> sav_any = 0x20c994830
> Any = 0x20785ad44
> nptr = 0x20c99495b ""
> Nptr = 0xfffffffffffcf18c ""
> i = 1
> rlen = 348
> info = (XExtDisplayInfo *) 0x20a1b7100
>
> ---8<---
>
> So, I've cherrypicked the patch at:
> http://patchwork.freedesktop.org/patch/2272/
>
> ...And applied it to SizeClassInfo() too as suggested (it won't hurt)
>
> This fixes the issue for me.
> Comments or suggestions?
You should ping Peter to ask him why this is still not committed
upstreams.
It looks to me like this changes the on-wire procol, but I'm not sure
and I haven't found time to check for real during the weekend.
>
> Index: src/XListDev.c
> ===================================================================
> RCS file: /cvs/xenocara/lib/libXi/src/XListDev.c,v
> retrieving revision 1.3
> diff -u -p -r1.3 XListDev.c
> --- src/XListDev.c 11 Nov 2010 10:49:22 -0000 1.3
> +++ src/XListDev.c 13 Jan 2012 13:07:33 -0000
> @@ -58,6 +58,17 @@ SOFTWARE.
> #include <X11/extensions/extutil.h>
> #include "XIint.h"
>
> +/* Calculate length field to a multiples of sizeof(XID). XIDs are typedefs
> + * to ulong and thus may be 8 bytes on some platforms. This can trigger a
> + * SIGBUS if a class ends up not being 8-aligned (e.g. after XAxisInfo).
> + */
> +static int pad_to_xid(int base_size)
> +{
> + int padsize = sizeof(XID);
> +
> + return ((base_size + padsize - 1)/padsize) * padsize;
> +}
> +
> static int
> SizeClassInfo(xAnyClassPtr *any, int num_classes)
> {
> @@ -66,18 +77,18 @@ SizeClassInfo(xAnyClassPtr *any, int num
> for (j = 0; j < num_classes; j++) {
> switch ((*any)->class) {
> case KeyClass:
> - size += sizeof(XKeyInfo);
> + size += pad_to_xid(sizeof(XKeyInfo));
> break;
> case ButtonClass:
> - size += sizeof(XButtonInfo);
> + size += pad_to_xid(sizeof(XButtonInfo));
> break;
> case ValuatorClass:
> {
> xValuatorInfoPtr v;
>
> v = (xValuatorInfoPtr) *any;
> - size += sizeof(XValuatorInfo) +
> - (v->num_axes * sizeof(XAxisInfo));
> + size += pad_to_xid(sizeof(XValuatorInfo) +
> + (v->num_axes * sizeof(XAxisInfo)));
> break;
> }
> default:
> @@ -102,7 +113,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
> xKeyInfoPtr k = (xKeyInfoPtr) *any;
>
> K->class = KeyClass;
> - K->length = sizeof(XKeyInfo);
> + K->length = pad_to_xid(sizeof(XKeyInfo));
> K->min_keycode = k->min_keycode;
> K->max_keycode = k->max_keycode;
> K->num_keys = k->num_keys;
> @@ -114,7 +125,7 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
> xButtonInfoPtr b = (xButtonInfoPtr) *any;
>
> B->class = ButtonClass;
> - B->length = sizeof(XButtonInfo);
> + B->length = pad_to_xid(sizeof(XButtonInfo));
> B->num_buttons = b->num_buttons;
> break;
> }
> @@ -126,8 +137,8 @@ ParseClassInfo(xAnyClassPtr *any, XAnyCl
> xAxisInfoPtr a;
>
> V->class = ValuatorClass;
> - V->length = sizeof(XValuatorInfo) +
> - (v->num_axes * sizeof(XAxisInfo));
> + V->length = pad_to_xid(sizeof(XValuatorInfo) +
> + (v->num_axes * sizeof(XAxisInfo)));
> V->num_axes = v->num_axes;
> V->motion_buffer = v->motion_buffer_size;
> V->mode = v->mode;
--
Matthieu Herrb