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